From 136cc93aa9dbf67eee46b10f8123c152af8f8b3e Mon Sep 17 00:00:00 2001 From: Robert Schmidt Date: Sun, 13 Feb 2022 15:50:12 +0100 Subject: [PATCH] Fix memory leaks in nr_dlschsim --- openair1/PHY/INIT/nr_init.c | 10 +++ openair1/PHY/INIT/phy_init.h | 1 + openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c | 67 +++++++++---------- .../PHY/NR_TRANSPORT/nr_transport_proto.h | 2 + openair1/SIMULATION/NR_PHY/dlschsim.c | 31 +++------ 5 files changed, 56 insertions(+), 55 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index e6b6c82834..a69b283dfb 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -553,6 +553,16 @@ void init_DLSCH_struct(PHY_VARS_gNB *gNB, processingData_L1tx_t *msg) { } } +void reset_DLSCH_struct(const PHY_VARS_gNB *gNB, processingData_L1tx_t *msg) +{ + const NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; + const nfapi_nr_config_request_scf_t *cfg = &gNB->gNB_config; + const uint16_t grid_size = cfg->carrier_config.dl_grid_size[fp->numerology_index].value; + for (int i=0; inumber_of_nr_dlsch_max; i++) + for (int j=0; j<2; j++) + free_gNB_dlsch(&msg->dlsch[i][j], grid_size); +} + void init_nr_transport(PHY_VARS_gNB *gNB) { NR_DL_FRAME_PARMS *fp = &gNB->frame_parms; LOG_I(PHY, "Initialise nr transport\n"); diff --git a/openair1/PHY/INIT/phy_init.h b/openair1/PHY/INIT/phy_init.h index dd9232de83..f66901f09a 100644 --- a/openair1/PHY/INIT/phy_init.h +++ b/openair1/PHY/INIT/phy_init.h @@ -410,6 +410,7 @@ void init_dfts(void); void fill_subframe_mask(PHY_VARS_eNB *eNB); void init_DLSCH_struct(PHY_VARS_gNB *gNB, processingData_L1tx_t *msg); +void reset_DLSCH_struct(const PHY_VARS_gNB *gNB, processingData_L1tx_t *msg); /** @} */ #endif diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c index 6d16fa531c..cdf0e6c152 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c @@ -55,42 +55,39 @@ void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB) { NR_gNB_DLSCH_t *dlsch = *dlschptr; uint16_t a_segments = MAX_NUM_NR_DLSCH_SEGMENTS; //number of segments to be allocated - if (dlsch) { - if (N_RB != 273) { - a_segments = a_segments*N_RB; - a_segments = a_segments/273 +1; - } - -#ifdef DEBUG_DLSCH_FREE - LOG_D(PHY,"Freeing dlsch %p\n",dlsch); -#endif - NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process; - - if (harq->b) { - free16(harq->b, a_segments * 1056); - harq->b = NULL; -#ifdef DEBUG_DLSCH_FREE - LOG_D(PHY, "Freeing harq->b (%p)\n", harq->b); -#endif - } - -#ifdef DEBUG_DLSCH_FREE - LOG_D(PHY, "Freeing dlsch process %d c (%p)\n", i, harq->c); -#endif - - for (r = 0; r < a_segments; r++) { -#ifdef DEBUG_DLSCH_FREE - LOG_D(PHY, "Freeing dlsch process %d c[%d] (%p)\n", i, r, harq->c[r]); -#endif - - if (harq->c[r]) { - free16(harq->c[r], 1056); - harq->c[r] = NULL; - } - } - free16(dlsch, sizeof(NR_gNB_DLSCH_t)); - *dlschptr = NULL; + if (N_RB != 273) { + a_segments = a_segments*N_RB; + a_segments = a_segments/273 +1; } + + NR_DL_gNB_HARQ_t *harq = &dlsch->harq_process; + if (harq->b) { + free16(harq->b, a_segments * 1056); + harq->b = NULL; + } + for (r = 0; r < a_segments; r++) { + free(harq->c[r]); + harq->c[r] = NULL; + } + free(harq->pdu); + + for (int aa = 0; aa < 64; aa++) + free(dlsch->calib_dl_ch_estimates[aa]); + free(dlsch->calib_dl_ch_estimates); + + for (int q=0; qmod_symbs[q]); + + for (int layer = 0; layer < NR_MAX_NB_LAYERS; layer++) { + free(dlsch->txdataF_precoding[layer]); + free(dlsch->txdataF[layer]); + for (int aa = 0; aa < 64; aa++) + free(dlsch->ue_spec_bf_weights[layer][aa]); + free(dlsch->ue_spec_bf_weights[layer]); + } + + free(dlsch); + *dlschptr = NULL; } NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index d45858bca0..e757e835b9 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -106,6 +106,8 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms, uint8_t abstraction_flag, uint16_t N_RB); +void free_gNB_dlsch(NR_gNB_DLSCH_t **dlschptr, uint16_t N_RB); + /** \brief This function is the top-level entry point to PUSCH demodulation, after frequency-domain transformation and channel estimation. It performs - RB extraction (signal and channel estimates) - channel compensation (matched filtering) diff --git a/openair1/SIMULATION/NR_PHY/dlschsim.c b/openair1/SIMULATION/NR_PHY/dlschsim.c index ed91fed9fa..62672cf36f 100644 --- a/openair1/SIMULATION/NR_PHY/dlschsim.c +++ b/openair1/SIMULATION/NR_PHY/dlschsim.c @@ -473,16 +473,13 @@ int main(int argc, char **argv) rel15->dlDmrsSymbPos = 4; rel15->mcsIndex[0] = Imcs; rel15->numDmrsCdmGrpsNoData = 1; - double *modulated_input = malloc16(sizeof(double) * 16 * 68 * 384); // [hna] 16 segments, 68*Zc - short *channel_output_fixed = malloc16(sizeof(short) * 16 * 68 * 384); - short *channel_output_uncoded = malloc16(sizeof(unsigned short) * 16 * 68 * 384); + double modulated_input[16 * 68 * 384]; // [hna] 16 segments, 68*Zc + short channel_output_fixed[16 * 68 * 384]; //unsigned char *estimated_output; - unsigned char *estimated_output_bit; - unsigned char *test_input_bit; unsigned int errors_bit = 0; - test_input_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384); + unsigned char test_input_bit[16 * 68 * 384]; //estimated_output = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384); - estimated_output_bit = (unsigned char *) malloc16(sizeof(unsigned char) * 16 * 68 * 384); + unsigned char estimated_output_bit[16 * 68 * 384]; NR_UE_DLSCH_t *dlsch0_ue = UE->dlsch[0][0][0]; NR_DL_UE_HARQ_t *harq_process = dlsch0_ue->harq_processes[harq_pid]; harq_process->mcs = Imcs; @@ -496,9 +493,10 @@ int main(int argc, char **argv) harq_process->dlDmrsSymbPos = 4; harq_process->n_dmrs_cdm_groups = 1; printf("harq process ue mcs = %d Qm = %d, symb %d\n", harq_process->mcs, harq_process->Qm, nb_symb_sch); + unsigned char *test_input; test_input = (unsigned char *) malloc16(sizeof(unsigned char) * TBS / 8); - + //unsigned char test_input[TBS / 8] __attribute__ ((aligned(16))); for (i = 0; i < TBS / 8; i++) test_input[i] = (unsigned char) rand(); @@ -555,12 +553,6 @@ int main(int argc, char **argv) i,modulated_input[i], i,channel_output_fixed[i]); */ - - //Uncoded BER - if (channel_output_fixed[i] < 0) - channel_output_uncoded[i] = 1; //QPSK demod - else - channel_output_uncoded[i] = 0; } #ifdef DEBUG_CODER @@ -642,12 +634,11 @@ int main(int argc, char **argv) } }*/ - for (i = 0; i < 2; i++) { - printf("gNB %d\n", i); - free_gNB_dlsch(&(msgDataTx.dlsch[0][i]),N_RB_DL); - printf("UE %d\n", i); - free_nr_ue_dlsch(&(UE->dlsch[0][0][i]),N_RB_DL); - } + free(test_input); + + free_channel_desc_scm(gNB2UE); + + reset_DLSCH_struct(gNB, &msgDataTx); for (i = 0; i < 2; i++) { free(s_re[i]);