From 900fcd9762e1eee1b85ad383383208e41d5e7d26 Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Wed, 30 Oct 2024 09:05:39 +0100 Subject: [PATCH 1/5] Thread safety for MAC config Move mac_IF_mutex to MAC instance and use it for ensuring thread safety when modifying MAC structures from RRC. --- openair2/LAYER2/NR_MAC_UE/config_ue.c | 14 +++++++++++++- openair2/LAYER2/NR_MAC_UE/mac_defs.h | 1 + openair2/LAYER2/NR_MAC_UE/main_ue_nr.c | 1 + openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 21 +++++++++------------ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index 19a799dab6..eea5a56abc 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -872,6 +872,8 @@ void nr_rrc_mac_config_req_mib(module_id_t module_id, int sched_sib) { NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + int ret = pthread_mutex_lock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); AssertFatal(mib, "MIB should not be NULL\n"); if (!mac->mib) mac->mib = calloc(1, sizeof(*mac->mib)); @@ -883,6 +885,7 @@ void nr_rrc_mac_config_req_mib(module_id_t module_id, else if (sched_sib == 2) mac->get_otherSI = true; nr_ue_decode_mib(mac, cc_idP); + pthread_mutex_unlock(&mac->if_mutex); } static void setup_puschpowercontrol(NR_UE_MAC_INST_t *mac, NR_PUSCH_PowerControl_t *source, NR_PUSCH_PowerControl_t *target) @@ -1611,6 +1614,8 @@ void nr_rrc_mac_config_req_reset(module_id_t module_id, NR_UE_MAC_reset_cause_t cause) { NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + int ret = pthread_mutex_lock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); fapi_nr_synch_request_t sync_req = {.target_Nid_cell = -1, .ssb_bw_scan = true}; switch (cause) { case GO_TO_IDLE: @@ -1649,6 +1654,7 @@ void nr_rrc_mac_config_req_reset(module_id_t module_id, default: AssertFatal(false, "Invalid MAC reset cause %d\n", cause); } + pthread_mutex_unlock(&mac->if_mutex); } static int get_ta_offset(long *n_TimingAdvanceOffset) @@ -1676,6 +1682,8 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, NR_ServingCellConfigCommonSIB_t *scc) { NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + int ret = pthread_mutex_lock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); AssertFatal(scc, "SIB1 SCC should not be NULL\n"); UPDATE_IE(mac->tdd_UL_DL_ConfigurationCommon, scc->tdd_UL_DL_ConfigurationCommon, NR_TDD_UL_DL_ConfigCommon_t); @@ -1708,6 +1716,7 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, if (!get_softmodem_params()->emulate_l1) mac->if_module->phy_config_request(&mac->phy_config); + pthread_mutex_unlock(&mac->if_mutex); } void nr_rrc_mac_config_req_sib19_r17(module_id_t module_id, @@ -2518,8 +2527,10 @@ void nr_rrc_mac_config_req_cg(module_id_t module_id, NR_UE_NR_Capability_t *ue_Capability) { LOG_I(MAC,"[UE %d] Applying CellGroupConfig from gNodeB\n", module_id); - AssertFatal(cell_group_config, "CellGroupConfig should not be NULL\n"); NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + int ret = pthread_mutex_lock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); + AssertFatal(cell_group_config, "CellGroupConfig should not be NULL\n"); if (cell_group_config->physicalCellGroupConfig) configure_physicalcellgroup(mac, cell_group_config->physicalCellGroupConfig); @@ -2562,4 +2573,5 @@ void nr_rrc_mac_config_req_cg(module_id_t module_id, if (!mac->dl_config_request || !mac->ul_config_request) ue_init_config_request(mac, mac->current_DL_BWP->scs); + pthread_mutex_unlock(&mac->if_mutex); } diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h index ffa09ccb25..426d8f88d1 100644 --- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h +++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h @@ -617,6 +617,7 @@ typedef struct NR_UE_MAC_INST_s { int f_b_f_c; bool pusch_power_control_initialized; int delta_msg2; + pthread_mutex_t if_mutex; } NR_UE_MAC_INST_t; /*@}*/ diff --git a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c index a60d8d2c43..7dfe198547 100644 --- a/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c +++ b/openair2/LAYER2/NR_MAC_UE/main_ue_nr.c @@ -70,6 +70,7 @@ void nr_ue_init_mac(NR_UE_MAC_INST_t *mac) mac->p_Max = INT_MIN; mac->p_Max_alt = INT_MIN; mac->n_ta_offset = -1; + pthread_mutex_init(&mac->if_mutex, NULL); reset_mac_inst(mac); // need to inizialize because might not been setup (optional timer) diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index c4faefa0fa..7b00b1bca2 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -65,7 +65,6 @@ queue_t nr_dl_tti_req_queue; queue_t nr_tx_req_queue; queue_t nr_ul_dci_req_queue; queue_t nr_ul_tti_req_queue; -pthread_mutex_t mac_IF_mutex; static void save_pdsch_pdu_for_crnti(nfapi_nr_dl_tti_request_t *dl_tti_request); void nrue_init_standalone_socket(int tx_port, int rx_port) @@ -1141,18 +1140,17 @@ void update_harq_status(NR_UE_MAC_INST_t *mac, uint8_t harq_pid, uint8_t ack_nac int nr_ue_ul_indication(nr_uplink_indication_t *ul_info) { - int ret = pthread_mutex_lock(&mac_IF_mutex); - AssertFatal(!ret, "mutex failed %d\n", ret); - LOG_D(PHY, "Locked in ul, slot %d\n", ul_info->slot); - module_id_t module_id = ul_info->module_id; NR_UE_MAC_INST_t *mac = get_mac_inst(module_id); + int ret = pthread_mutex_lock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); + LOG_D(PHY, "Locked in ul, slot %d\n", ul_info->slot); LOG_T(NR_MAC, "Not calling scheduler mac->ra.ra_state = %d\n", mac->ra.ra_state); if (is_nr_UL_slot(mac->tdd_UL_DL_ConfigurationCommon, ul_info->slot, mac->frame_type)) nr_ue_ul_scheduler(mac, ul_info); - pthread_mutex_unlock(&mac_IF_mutex); + pthread_mutex_unlock(&mac->if_mutex); return 0; } @@ -1264,26 +1262,26 @@ static uint32_t nr_ue_dl_processing(nr_downlink_indication_t *dl_info) int nr_ue_dl_indication(nr_downlink_indication_t *dl_info) { - int ret = pthread_mutex_lock(&mac_IF_mutex); - AssertFatal(!ret, "mutex failed %d\n", ret); uint32_t ret2 = 0; NR_UE_MAC_INST_t *mac = get_mac_inst(dl_info->module_id); + int ret = pthread_mutex_lock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); if (!dl_info->dci_ind && !dl_info->rx_ind) // DL indication to process DCI reception nr_ue_dl_scheduler(mac, dl_info); else // DL indication to process data channels ret2 = nr_ue_dl_processing(dl_info); - pthread_mutex_unlock(&mac_IF_mutex); + pthread_mutex_unlock(&mac->if_mutex); return ret2; } void nr_ue_slot_indication(uint8_t mod_id) { - pthread_mutex_lock(&mac_IF_mutex); NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); + pthread_mutex_lock(&mac->if_mutex); update_mac_timers(mac); - pthread_mutex_unlock(&mac_IF_mutex); + pthread_mutex_unlock(&mac->if_mutex); } nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id) @@ -1309,7 +1307,6 @@ nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id) nr_ue_if_module_inst[module_id]->ul_indication = nr_ue_ul_indication; nr_ue_if_module_inst[module_id]->slot_indication = nr_ue_slot_indication; } - pthread_mutex_init(&mac_IF_mutex, NULL); return nr_ue_if_module_inst[module_id]; } From 0109a6b976202b2f70e7ab31722db7be0e9dbc04 Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Tue, 29 Oct 2024 14:40:51 +0100 Subject: [PATCH 2/5] Fix data race on csirs_vars csirs_vars used to be global array for each UE. Now its present in phy_data which is in dynamically allocated memory. --- openair1/PHY/INIT/nr_init_ue.c | 4 ---- openair1/PHY/NR_UE_TRANSPORT/csi_rx.c | 11 ++--------- openair1/PHY/defs_nr_UE.h | 3 +-- openair1/SCHED_NR_UE/defs.h | 3 ++- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 4 ++-- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 6 +++--- 6 files changed, 10 insertions(+), 21 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 577f7a44d8..0e56cfef25 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -172,7 +172,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) NR_UE_COMMON *const common_vars = &ue->common_vars; NR_UE_PRACH **const prach_vars = ue->prach_vars; NR_UE_CSI_IM **const csiim_vars = ue->csiim_vars; - NR_UE_CSI_RS **const csirs_vars = ue->csirs_vars; NR_UE_SRS **const srs_vars = ue->srs_vars; LOG_I(PHY, "Initializing UE vars for gNB TXant %u, UE RXant %u\n", fp->nb_antennas_tx, fp->nb_antennas_rx); @@ -260,11 +259,9 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { prach_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_PRACH)); csiim_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_CSI_IM)); - csirs_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_CSI_RS)); srs_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_SRS)); csiim_vars[gNB_id]->active = false; - csirs_vars[gNB_id]->active = false; srs_vars[gNB_id]->active = false; // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32) @@ -327,7 +324,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->nr_srs_info); free_and_zero(ue->csiim_vars[gNB_id]); - free_and_zero(ue->csirs_vars[gNB_id]); free_and_zero(ue->srs_vars[gNB_id]); free_and_zero(ue->prach_vars[gNB_id]); diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c index eed7da6556..0f5ddcdefa 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c +++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c @@ -877,17 +877,10 @@ static void nr_ue_generate_csi_rs(const fapi_nr_dl_config_csirs_pdu_rel15_t *csi void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP], + fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu) { - int gNB_id = proc->gNB_id; - if(!ue->csirs_vars[gNB_id]->active) { - return; - } - ue->csirs_vars[gNB_id]->active = 0; - - const fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu = &ue->csirs_vars[gNB_id]->csirs_config_pdu; - #ifdef NR_CSIRS_DEBUG LOG_I(NR_PHY, "csirs_config_pdu->subcarrier_spacing = %i\n", csirs_config_pdu->subcarrier_spacing); LOG_I(NR_PHY, "csirs_config_pdu->cyclic_prefix = %i\n", csirs_config_pdu->cyclic_prefix); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 4def69049e..78a109e4bd 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -397,7 +397,6 @@ typedef struct PHY_VARS_NR_UE_s { NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_CSI_IM *csiim_vars[NUMBER_OF_CONNECTED_gNB_MAX]; - NR_UE_CSI_RS *csirs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_SRS *srs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; uint8_t prs_active_gNBs; @@ -603,7 +602,7 @@ typedef struct nr_phy_data_s { // Sidelink Rx action decided by MAC sl_nr_rx_config_type_enum_t sl_rx_action; - + NR_UE_CSI_RS csirs_vars; } nr_phy_data_t; enum stream_status_e { STREAM_STATUS_UNSYNC, STREAM_STATUS_SYNCING, STREAM_STATUS_SYNCED}; diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index 4174e44238..46e3603525 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -155,7 +155,8 @@ void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP], + fapi_nr_dl_config_csirs_pdu_rel15_t *csirs_config_pdu); int psbch_pscch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_t *phy_data); void phy_procedures_nrUE_SL_TX(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_data_tx_t *phy_data); diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 32fa53cc60..967371e6dd 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -424,8 +424,8 @@ static void nr_ue_scheduled_response_dl(NR_UE_MAC_INST_t *mac, phy->csiim_vars[0]->active = true; break; case FAPI_NR_DL_CONFIG_TYPE_CSI_RS: - phy->csirs_vars[0]->csirs_config_pdu = pdu->csirs_config_pdu.csirs_config_rel15; - phy->csirs_vars[0]->active = true; + phy_data->csirs_vars.csirs_config_pdu = pdu->csirs_config_pdu.csirs_config_rel15; + phy_data->csirs_vars.active = true; break; case FAPI_NR_DL_CONFIG_TYPE_RA_DLSCH: { fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu = &pdu->dlsch_config_pdu.dlsch_config_rel15; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index cf1ebf8319..99379e2edc 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1071,16 +1071,16 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_ } // do procedures for CSI-RS - if ((ue->csirs_vars[gNB_id]) && (ue->csirs_vars[gNB_id]->active == 1)) { + if (phy_data->csirs_vars.active == 1) { for(int symb = 0; symb < NR_SYMBOLS_PER_SLOT; symb++) { - if(is_csi_rs_in_symbol(ue->csirs_vars[gNB_id]->csirs_config_pdu, symb)) { + if(is_csi_rs_in_symbol(phy_data->csirs_vars.csirs_config_pdu, symb)) { if (!slot_fep_map[symb]) { nr_slot_fep(ue, &ue->frame_parms, proc->nr_slot_rx, symb, rxdataF, link_type_dl, 0, ue->common_vars.rxdata); slot_fep_map[symb] = true; } } } - nr_ue_csi_rs_procedures(ue, proc, rxdataF); + nr_ue_csi_rs_procedures(ue, proc, rxdataF, &phy_data->csirs_vars.csirs_config_pdu); } if (dlsch[0].active) { From f6ea1648e90f21ed2fd5d16514e16ba1e53c4c10 Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Tue, 29 Oct 2024 14:48:57 +0100 Subject: [PATCH 3/5] Fix data race on csiim_vars csiim_vars used to be global array for each UE. Now its present in phy_data which is in dynamically allocated memory --- openair1/PHY/INIT/nr_init_ue.c | 5 ----- openair1/PHY/NR_UE_TRANSPORT/csi_rx.c | 8 ++------ openair1/PHY/defs_nr_UE.h | 2 +- openair1/SCHED_NR_UE/defs.h | 3 ++- openair1/SCHED_NR_UE/fapi_nr_ue_l1.c | 4 ++-- openair1/SCHED_NR_UE/phy_procedures_nr_ue.c | 7 +++---- 6 files changed, 10 insertions(+), 19 deletions(-) diff --git a/openair1/PHY/INIT/nr_init_ue.c b/openair1/PHY/INIT/nr_init_ue.c index 0e56cfef25..ea4d5ca22a 100644 --- a/openair1/PHY/INIT/nr_init_ue.c +++ b/openair1/PHY/INIT/nr_init_ue.c @@ -171,7 +171,6 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) NR_DL_FRAME_PARMS *const fp = &ue->frame_parms; NR_UE_COMMON *const common_vars = &ue->common_vars; NR_UE_PRACH **const prach_vars = ue->prach_vars; - NR_UE_CSI_IM **const csiim_vars = ue->csiim_vars; NR_UE_SRS **const srs_vars = ue->srs_vars; LOG_I(PHY, "Initializing UE vars for gNB TXant %u, UE RXant %u\n", fp->nb_antennas_tx, fp->nb_antennas_rx); @@ -258,10 +257,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) // DLSCH for (int gNB_id = 0; gNB_id < ue->n_connected_gNB; gNB_id++) { prach_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_PRACH)); - csiim_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_CSI_IM)); srs_vars[gNB_id] = malloc16_clear(sizeof(NR_UE_SRS)); - - csiim_vars[gNB_id]->active = false; srs_vars[gNB_id]->active = false; // ceil((NB_RB*8(max allocation per RB)*2(QPSK))/32) @@ -323,7 +319,6 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB) free_and_zero(ue->nr_srs_info); - free_and_zero(ue->csiim_vars[gNB_id]); free_and_zero(ue->srs_vars[gNB_id]); free_and_zero(ue->prach_vars[gNB_id]); diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c index 0f5ddcdefa..bcd24fef4a 100644 --- a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c +++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c @@ -793,13 +793,9 @@ static void nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue, void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]) + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP], + const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu) { - int gNB_id = proc->gNB_id; - if(!ue->csiim_vars[gNB_id]->active) - LOG_E(NR_PHY, "Scheduling reception of CSI-IM that is not active\n"); - - const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu = (fapi_nr_dl_config_csiim_pdu_rel15_t*)&ue->csiim_vars[gNB_id]->csiim_config_pdu; #ifdef NR_CSIIM_DEBUG LOG_I(NR_PHY, "csiim_config_pdu->bwp_size = %i\n", csiim_config_pdu->bwp_size); diff --git a/openair1/PHY/defs_nr_UE.h b/openair1/PHY/defs_nr_UE.h index 78a109e4bd..12b10e4b96 100644 --- a/openair1/PHY/defs_nr_UE.h +++ b/openair1/PHY/defs_nr_UE.h @@ -396,7 +396,6 @@ typedef struct PHY_VARS_NR_UE_s { nr_synch_request_t synch_request; NR_UE_PRACH *prach_vars[NUMBER_OF_CONNECTED_gNB_MAX]; - NR_UE_CSI_IM *csiim_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_SRS *srs_vars[NUMBER_OF_CONNECTED_gNB_MAX]; NR_UE_PRS *prs_vars[NR_MAX_PRS_COMB_SIZE]; uint8_t prs_active_gNBs; @@ -603,6 +602,7 @@ typedef struct nr_phy_data_s { // Sidelink Rx action decided by MAC sl_nr_rx_config_type_enum_t sl_rx_action; NR_UE_CSI_RS csirs_vars; + NR_UE_CSI_IM csiim_vars; } nr_phy_data_t; enum stream_status_e { STREAM_STATUS_UNSYNC, STREAM_STATUS_SYNCING, STREAM_STATUS_SYNCED}; diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index 46e3603525..7ae4bb6a70 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -151,7 +151,8 @@ int nr_ue_pdcch_procedures(PHY_VARS_NR_UE *ue, void nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, - c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]); + c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP], + const fapi_nr_dl_config_csiim_pdu_rel15_t *csiim_config_pdu); void nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, diff --git a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c index 967371e6dd..dc2db2d2ea 100644 --- a/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c +++ b/openair1/SCHED_NR_UE/fapi_nr_ue_l1.c @@ -420,8 +420,8 @@ static void nr_ue_scheduled_response_dl(NR_UE_MAC_INST_t *mac, LOG_D(PHY, "Number of DCI SearchSpaces %d\n", phy_data->phy_pdcch_config.nb_search_space); break; case FAPI_NR_DL_CONFIG_TYPE_CSI_IM: - phy->csiim_vars[0]->csiim_config_pdu = pdu->csiim_config_pdu.csiim_config_rel15; - phy->csiim_vars[0]->active = true; + phy_data->csiim_vars.csiim_config_pdu = pdu->csiim_config_pdu.csiim_config_rel15; + phy_data->csiim_vars.active = true; break; case FAPI_NR_DL_CONFIG_TYPE_CSI_RS: phy_data->csirs_vars.csirs_config_pdu = pdu->csirs_config_pdu.csirs_config_rel15; diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index 99379e2edc..0e1864cad1 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1058,16 +1058,15 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_ __attribute__ ((aligned(32))) c16_t rxdataF[ue->frame_parms.nb_antennas_rx][rxdataF_sz]; // do procedures for CSI-IM - if ((ue->csiim_vars[gNB_id]) && (ue->csiim_vars[gNB_id]->active == 1)) { + if (phy_data->csiim_vars.active == 1) { for(int symb_idx = 0; symb_idx < 4; symb_idx++) { - int symb = ue->csiim_vars[gNB_id]->csiim_config_pdu.l_csiim[symb_idx]; + int symb = phy_data->csiim_vars.csiim_config_pdu.l_csiim[symb_idx]; if (!slot_fep_map[symb]) { nr_slot_fep(ue, &ue->frame_parms, proc->nr_slot_rx, symb, rxdataF, link_type_dl, 0, ue->common_vars.rxdata); slot_fep_map[symb] = true; } } - nr_ue_csi_im_procedures(ue, proc, rxdataF); - ue->csiim_vars[gNB_id]->active = 0; + nr_ue_csi_im_procedures(ue, proc, rxdataF, &phy_data->csiim_vars.csiim_config_pdu); } // do procedures for CSI-RS From 4d070036529199231f184c63c30933473c3b91a1 Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Wed, 30 Oct 2024 09:54:26 +0100 Subject: [PATCH 4/5] Thread safe get_ue_nas_info Call get_ue_nas_info before any thread starts to prevent concurrent initialization of uicc array. --- executables/nr-uesoftmodem.c | 1 + openair3/NAS/NR_UE/nr_nas_msg.c | 11 ++++++----- openair3/NAS/NR_UE/nr_nas_msg.h | 1 + 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c index 4e5e1a19f9..dabb0bc8e2 100644 --- a/executables/nr-uesoftmodem.c +++ b/executables/nr-uesoftmodem.c @@ -453,6 +453,7 @@ int main(int argc, char **argv) init_pdcp(0); else init_pdcp(mode_offset + ue_id_g); + nas_init_nrue(NB_UE_INST); init_NR_UE(NB_UE_INST, get_nrUE_params()->uecap_file, get_nrUE_params()->reconfig_file, get_nrUE_params()->rbconfig_file); diff --git a/openair3/NAS/NR_UE/nr_nas_msg.c b/openair3/NAS/NR_UE/nr_nas_msg.c index 59d646e3df..1199aad94b 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg.c +++ b/openair3/NAS/NR_UE/nr_nas_msg.c @@ -1210,11 +1210,6 @@ static int get_user_nssai_idx(const nr_nas_msg_snssai_t allowed_nssai[8], const void *nas_nrue_task(void *args_p) { - for (int UE_id = 0; UE_id < NB_UE_INST; UE_id++) { - // This sets UE uicc from command line. Needs to be called 2 seconds into nr-ue runtime, otherwise the unused command line - // arguments will be reported as unused and the modem asserts. - (void)get_ue_nas_info(UE_id); - } while (1) { nas_nrue(NULL); } @@ -1453,3 +1448,9 @@ void *nas_nrue(void *args_p) } return NULL; } + +void nas_init_nrue(int num_ues) { + for (int i = 0; i < num_ues; i++) { + (void)get_ue_nas_info(i); + } +} diff --git a/openair3/NAS/NR_UE/nr_nas_msg.h b/openair3/NAS/NR_UE/nr_nas_msg.h index 2e687baf8f..e10ac54b0f 100644 --- a/openair3/NAS/NR_UE/nr_nas_msg.h +++ b/openair3/NAS/NR_UE/nr_nas_msg.h @@ -160,5 +160,6 @@ nr_ue_nas_t *get_ue_nas_info(module_id_t module_id); void generateRegistrationRequest(as_nas_info_t *initialNasMsg, nr_ue_nas_t *nas); void *nas_nrue_task(void *args_p); void *nas_nrue(void *args_p); +void nas_init_nrue(int num_ues); #endif /* __NR_NAS_MSG_SIM_H__*/ From af63f3f91cd829fc879a9f129025650159556e38 Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Wed, 6 Nov 2024 09:58:17 +0100 Subject: [PATCH 5/5] Add missing asserts for mac->if_mutex lock/unlock calls --- openair2/LAYER2/NR_MAC_UE/config_ue.c | 12 ++++++++---- openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c | 13 ++++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c index eea5a56abc..3c66515eef 100644 --- a/openair2/LAYER2/NR_MAC_UE/config_ue.c +++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c @@ -885,7 +885,8 @@ void nr_rrc_mac_config_req_mib(module_id_t module_id, else if (sched_sib == 2) mac->get_otherSI = true; nr_ue_decode_mib(mac, cc_idP); - pthread_mutex_unlock(&mac->if_mutex); + ret = pthread_mutex_unlock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); } static void setup_puschpowercontrol(NR_UE_MAC_INST_t *mac, NR_PUSCH_PowerControl_t *source, NR_PUSCH_PowerControl_t *target) @@ -1654,7 +1655,8 @@ void nr_rrc_mac_config_req_reset(module_id_t module_id, default: AssertFatal(false, "Invalid MAC reset cause %d\n", cause); } - pthread_mutex_unlock(&mac->if_mutex); + ret = pthread_mutex_unlock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); } static int get_ta_offset(long *n_TimingAdvanceOffset) @@ -1716,7 +1718,8 @@ void nr_rrc_mac_config_req_sib1(module_id_t module_id, if (!get_softmodem_params()->emulate_l1) mac->if_module->phy_config_request(&mac->phy_config); - pthread_mutex_unlock(&mac->if_mutex); + ret = pthread_mutex_unlock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); } void nr_rrc_mac_config_req_sib19_r17(module_id_t module_id, @@ -2573,5 +2576,6 @@ void nr_rrc_mac_config_req_cg(module_id_t module_id, if (!mac->dl_config_request || !mac->ul_config_request) ue_init_config_request(mac, mac->current_DL_BWP->scs); - pthread_mutex_unlock(&mac->if_mutex); + ret = pthread_mutex_unlock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); } diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c index 7b00b1bca2..24f5469286 100644 --- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c @@ -1150,8 +1150,8 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info) if (is_nr_UL_slot(mac->tdd_UL_DL_ConfigurationCommon, ul_info->slot, mac->frame_type)) nr_ue_ul_scheduler(mac, ul_info); - pthread_mutex_unlock(&mac->if_mutex); - + ret = pthread_mutex_unlock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); return 0; } @@ -1272,16 +1272,19 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info) else // DL indication to process data channels ret2 = nr_ue_dl_processing(dl_info); - pthread_mutex_unlock(&mac->if_mutex); + ret = pthread_mutex_unlock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); return ret2; } void nr_ue_slot_indication(uint8_t mod_id) { NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id); - pthread_mutex_lock(&mac->if_mutex); + int ret = pthread_mutex_lock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); update_mac_timers(mac); - pthread_mutex_unlock(&mac->if_mutex); + ret = pthread_mutex_unlock(&mac->if_mutex); + AssertFatal(!ret, "mutex failed %d\n", ret); } nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id)