From d092231181c7c9fd10da6d62149bb02a0be0c895 Mon Sep 17 00:00:00 2001
From: Robert Schmidt <robert.schmidt@eurecom.fr>
Date: Fri, 26 Jan 2018 14:49:45 +0100
Subject: [PATCH] free memory when stopping/restarting lte-softmodem

- add function free_td() -> complements init_td() [seems to not be used, added
  for completeness]
- add function free_td8() -> undoes init_td8() [free memory of 8-bit LLR Turbo
  decoder]
- add function free_td16() -> undoes init_td16() [free memory of 16-bit LLR
  Turbo decoder]
- change function free_tdavx216() -> undoes init_tdavx216() [free memory of
  16-bit LLR Turbo decoder, AVX2 version]
- add free_lte_top() -> frees memory allocated by init_lte_top()
- change free_ul_ref_sigs() to set freed pointers to NULL
- add method free_transport() -> frees memory of ULSCH/DLSCH transport channels
- use the above functions when stopping/restarting the lte-softmodem
---
 .../CODING/3gpplte_turbo_decoder_avx2_16bit.c |  8 ++++----
 .../PHY/CODING/3gpplte_turbo_decoder_sse.c    | 12 +++++++++++
 .../CODING/3gpplte_turbo_decoder_sse_16bit.c  |  8 ++++----
 .../CODING/3gpplte_turbo_decoder_sse_8bit.c   |  8 ++++----
 openair1/PHY/CODING/defs.h                    | 10 ++++++++++
 openair1/PHY/INIT/defs.h                      |  1 +
 openair1/PHY/INIT/lte_init.c                  | 12 +++++++++++
 openair1/PHY/LTE_REFSIG/lte_ul_ref.c          |  8 ++++++--
 openair1/PHY/LTE_TRANSPORT/proto.h            |  6 ++++++
 targets/RT/USER/lte-enb.c                     | 20 ++++++++++++++++++-
 targets/RT/USER/lte-ru.c                      |  2 --
 targets/RT/USER/lte-softmodem.c               |  8 +++++++-
 12 files changed, 85 insertions(+), 18 deletions(-)

diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
index 616eed7446..83a50f214b 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_avx2_16bit.c
@@ -830,10 +830,10 @@ void free_td16avx2(void)
   int ind;
 
   for (ind=0; ind<188; ind++) {
-    free(pi2tab16avx2[ind]);
-    free(pi5tab16avx2[ind]);
-    free(pi4tab16avx2[ind]);
-    free(pi6tab16avx2[ind]);
+    free_and_zero(pi2tab16avx2[ind]);
+    free_and_zero(pi5tab16avx2[ind]);
+    free_and_zero(pi4tab16avx2[ind]);
+    free_and_zero(pi6tab16avx2[ind]);
   }
 }
 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c
index 9ec25367d9..f628bff55b 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse.c
@@ -1907,6 +1907,18 @@ void compute_ext(llr_t* alpha,llr_t* beta,llr_t* m_11,llr_t* m_10,llr_t* ext, ll
 //int pi2[n],pi3[n+8],pi5[n+8],pi4[n+8],pi6[n+8],
 int *pi2tab[188],*pi5tab[188],*pi4tab[188],*pi6tab[188];
 
+void free_td()
+{
+  int ind;
+
+  for (ind = 0; ind < 188; ind++) {
+    free_and_zero(pi2tab[ind]);
+    free_and_zero(pi5tab[ind]);
+    free_and_zero(pi4tab[ind]);
+    free_and_zero(pi6tab[ind]);
+  }
+}
+
 void init_td()
 {
 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
index cb4a4e1f84..a32edd711d 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_16bit.c
@@ -1117,10 +1117,10 @@ void free_td16(void)
   int ind;
 
   for (ind=0; ind<188; ind++) {
-    free(pi2tab16[ind]);
-    free(pi5tab16[ind]);
-    free(pi4tab16[ind]);
-    free(pi6tab16[ind]);
+    free_and_zero(pi2tab16[ind]);
+    free_and_zero(pi5tab16[ind]);
+    free_and_zero(pi4tab16[ind]);
+    free_and_zero(pi6tab16[ind]);
   }
 }
 
diff --git a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
index d6ef84b218..4754e26f38 100644
--- a/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
+++ b/openair1/PHY/CODING/3gpplte_turbo_decoder_sse_8bit.c
@@ -838,10 +838,10 @@ void free_td8(void)
   int ind;
 
   for (ind=0; ind<188; ind++) {
-    free(pi2tab8[ind]);
-    free(pi5tab8[ind]);
-    free(pi4tab8[ind]);
-    free(pi6tab8[ind]);
+    free_and_zero(pi2tab8[ind]);
+    free_and_zero(pi5tab8[ind]);
+    free_and_zero(pi4tab8[ind]);
+    free_and_zero(pi6tab8[ind]);
   }
 }
 
diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h
index 06311a188b..9150e19bf1 100644
--- a/openair1/PHY/CODING/defs.h
+++ b/openair1/PHY/CODING/defs.h
@@ -356,10 +356,17 @@ void ccodedab_init_inv(void);
 \brief This function initializes the different crc tables.*/
 void crcTableInit (void);
 
+/*!\fn void free_td8(void)
+\brief This function frees the tables for 8-bit LLR Turbo decoder.*/
+void free_td8(void);
+
 /*!\fn void init_td8(void)
 \brief This function initializes the tables for 8-bit LLR Turbo decoder.*/
 void init_td8 (void);
 
+/*!\fn void free_td16(void)
+\brief This function frees the tables for 16-bit LLR Turbo decoder.*/
+void free_td16(void);
 
 /*!\fn void init_td16(void)
 \brief This function initializes the tables for 16-bit LLR Turbo decoder.*/
@@ -370,6 +377,9 @@ void init_td16 (void);
 \brief This function initializes the tables for 8-bit LLR Turbo decoder (AVX2).*/
 void init_td8avx2 (void);
 
+/*!\fn void free_td16avx2(void)
+\brief This function frees the tables for 16-bit LLR Turbo decoder (AVX2).*/
+void free_td16avx2(void);
 
 /*!\fn void init_td16(void)
 \brief This function initializes the tables for 16-bit LLR Turbo decoder (AVX2).*/
diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h
index e7972335ab..55d220824e 100644
--- a/openair1/PHY/INIT/defs.h
+++ b/openair1/PHY/INIT/defs.h
@@ -324,6 +324,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *phy_vars_eNB);
  */
 int phy_init_secsys_eNB(PHY_VARS_eNB *phy_vars_eNb);
 
+void free_lte_top(void);
 
 void init_lte_top(LTE_DL_FRAME_PARMS *lte_frame_parms);
 
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index f5db781309..86ed62040f 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -1247,6 +1247,18 @@ void  phy_config_cba_rnti (module_id_t Mod_id,int CC_id,eNB_flag_t eNB_flag, uin
   }
 }
 
+void free_lte_top(void)
+{
+  free_td8();
+  free_td16();
+#ifdef __AVX2__
+  free_td16avx2();
+#endif
+  lte_sync_time_free();
+
+  /* free_ul_ref_sigs() is called in phy_free_lte_eNB() */
+}
+
 void init_lte_top(LTE_DL_FRAME_PARMS *frame_parms)
 {
 
diff --git a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c
index cddb642b2b..cacd0f4292 100644
--- a/openair1/PHY/LTE_REFSIG/lte_ul_ref.c
+++ b/openair1/PHY/LTE_REFSIG/lte_ul_ref.c
@@ -188,11 +188,15 @@ void free_ul_ref_sigs(void)
   for (Msc_RS=2; Msc_RS<33; Msc_RS++) {
     for (u=0; u<30; u++) {
       for (v=0; v<2; v++) {
-        if (ul_ref_sigs[u][v][Msc_RS])
+        if (ul_ref_sigs[u][v][Msc_RS]) {
           free16(ul_ref_sigs[u][v][Msc_RS],2*sizeof(int16_t)*dftsizes[Msc_RS]);
+          ul_ref_sigs_rx[u][v][Msc_RS] = NULL;
+        }
 
-        if (ul_ref_sigs_rx[u][v][Msc_RS])
+        if (ul_ref_sigs_rx[u][v][Msc_RS]) {
           free16(ul_ref_sigs_rx[u][v][Msc_RS],4*sizeof(int16_t)*dftsizes[Msc_RS]);
+          ul_ref_sigs_rx[u][v][Msc_RS] = NULL;
+        }
       }
     }
   }
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index 8a0e160f23..98a32f68a0 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -83,6 +83,12 @@ void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
 
 void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch);
 
+/** \fn free_eNB_ulsch(LTE_eNB_DLSCH_t *dlsch)
+    \brief This function frees memory allocated for a particular ULSCH at eNB
+    @param ulsch Pointer to ULSCH to be removed
+*/
+void free_eNB_ulsch(LTE_eNB_ULSCH_t *ulsch);
+
 LTE_eNB_ULSCH_t *new_eNB_ulsch(uint8_t max_turbo_iterations,uint8_t N_RB_UL, uint8_t abstraction_flag);
 
 LTE_UE_ULSCH_t *new_ue_ulsch(unsigned char N_RB_UL, uint8_t abstraction_flag);
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index ece2b75c77..bd9fbab19d 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -794,6 +794,21 @@ void print_opp_meas(void) {
   }
 }
 
+void free_transport(PHY_VARS_eNB *eNB)
+{
+  int i;
+  int j;
+
+  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
+    LOG_I(PHY, "Freeing Transport Channel Buffers for DLSCH, UE %d\n",i);
+    for (j=0; j<2; j++) free_eNB_dlsch(eNB->dlsch[i][j]);
+
+    LOG_I(PHY, "Freeing Transport Channel Buffer for ULSCH, UE %d\n",i);
+    free_eNB_ulsch(eNB->ulsch[1+i]);
+  }
+  free_eNB_ulsch(eNB->ulsch[0]);
+}
+
 void init_transport(PHY_VARS_eNB *eNB) {
 
   int i;
@@ -975,6 +990,9 @@ void stop_eNB(int nb_inst) {
     LOG_I(PHY,"Killing eNB %d processing threads\n",inst);
     kill_eNB_proc(inst);
     /* release memory used by these threads (incomplete) */
-    for (int cc_id = 0; cc_id < RC.nb_CC[inst]; cc_id++) phy_free_lte_eNB(RC.eNB[inst][cc_id]);
+    for (int cc_id = 0; cc_id < RC.nb_CC[inst]; cc_id++) {
+      free_transport(RC.eNB[inst][cc_id]);
+      phy_free_lte_eNB(RC.eNB[inst][cc_id]);
+    }
   }
 }
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 6459b6a58d..5a2f49212c 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -1557,8 +1557,6 @@ void *ru_thread_synch(void *arg) {
     if (release_thread(&ru->proc.mutex_synch,&ru->proc.instance_cnt_synch,"ru_synch_thread") < 0) break;
   } // oai_exit
 
-  lte_sync_time_free();
-
   ru_thread_synch_status = 0;
   return &ru_thread_synch_status;
 
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 6ae35a9bf0..8df540bc49 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -884,6 +884,7 @@ void terminate_task(task_id_t task_id, module_id_t mod_id)
   itti_send_msg_to_task (task_id, ENB_MODULE_ID_TO_INSTANCE(mod_id), msg);
 }
 
+extern void  free_transport(PHY_VARS_eNB *);
 extern void  phy_free_RU(RU_t*);
 
 int stop_L1L2(module_id_t enb_id)
@@ -923,8 +924,12 @@ int stop_L1L2(module_id_t enb_id)
   LOG_I(ENB_APP, "calling kill_RU_proc() for instance %d\n", enb_id);
   kill_RU_proc(enb_id);
   oai_exit = 0;
-  for (int cc_id = 0; cc_id < RC.nb_CC[enb_id]; cc_id++) phy_free_lte_eNB(RC.eNB[enb_id][cc_id]);
+  for (int cc_id = 0; cc_id < RC.nb_CC[enb_id]; cc_id++) {
+    free_transport(RC.eNB[enb_id][cc_id]);
+    phy_free_lte_eNB(RC.eNB[enb_id][cc_id]);
+  }
   phy_free_RU(RC.ru[enb_id]);
+  free_lte_top();
   return 0;
 }
 
@@ -1491,6 +1496,7 @@ int main( int argc, char **argv )
   } else {
     stop_eNB(NB_eNB_INST);
     stop_RU(NB_RU);
+    free_lte_top();
   }
 
 
-- 
GitLab