Release memory-block-pool memory back to malloc.
authorJan Hubicka <jh@suse.cz>
Fri, 22 Nov 2019 14:37:37 +0000 (15:37 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 22 Nov 2019 14:37:37 +0000 (14:37 +0000)
* ggc-page.c (ggc_collect): Call memory_block_pool::trim.
* memory-block.cc (memory_block_pool::clear_free_list): Rename to ...
(memory_block_pool::reduce_free_list): ... this one.
(memory_block_pool::trim): New static function.
* memory-block.h (memory_block_pool::freelist_size): New constant
(memory_block_pool::clear_free_list): Rename to ...
(memory_block_pool::reduce_free_list): ... this one.
(memory_block_pool::trim): Declare.

* lto.c (lto_wpa_write_files): Call memory_block_pool::trim.

From-SVN: r278616

gcc/ChangeLog
gcc/ggc-page.c
gcc/lto/ChangeLog
gcc/lto/lto.c
gcc/memory-block.cc
gcc/memory-block.h

index bdd0fc529b7944d9bcf334256cc61d5ff4f94372..62ddef2dd31af7b2ac463e3fe41448c99d251763 100644 (file)
@@ -1,3 +1,14 @@
+2019-11-22  Jan Hubicka  <jh@suse.cz>
+
+       * ggc-page.c (ggc_collect): Call memory_block_pool::trim.
+       * memory-block.cc (memory_block_pool::clear_free_list): Rename to ...
+       (memory_block_pool::reduce_free_list): ... this one.
+       (memory_block_pool::trim): New static function.
+       * memory-block.h (memory_block_pool::freelist_size): New constant
+       (memory_block_pool::clear_free_list): Rename to ...
+       (memory_block_pool::reduce_free_list): ... this one.
+       (memory_block_pool::trim): Declare.
+
 2019-11-22  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vect-stmts.c (vect_model_simple_cost): Take an optional
index dde39e680da6a53de048198da32854358f44e709..4a6a7c9598ed98b1102642e3f0c5a0787a268b8d 100644 (file)
@@ -2186,6 +2186,9 @@ ggc_collect (void)
   float allocated_last_gc =
     MAX (G.allocated_last_gc, (size_t)param_ggc_min_heapsize * 1024);
 
+  /* It is also good time to get memory block pool into limits.  */
+  memory_block_pool::trim ();
+
   float min_expand = allocated_last_gc * param_ggc_min_expand / 100;
   if (G.allocated < allocated_last_gc + min_expand && !ggc_force_collect)
     return;
index ba3e38aa3640423aebd4de711d9dae5d6cd0fbbe..cdf6964fbb7995972a66ab26fe86c0c356b38ed0 100644 (file)
@@ -1,3 +1,7 @@
+2019-11-22  Jan Hubicka  <jh@suse.cz>
+       
+       * lto.c (lto_wpa_write_files): Call memory_block_pool::trim.
+
 2019-11-14  Martin Liska  <mliska@suse.cz>
 
        * Make-lang.in: Remove wrong dependency
index b7e6ffd8c8bbe1077e672d338fef39afd04f99e0..c9e0fcd8a8e77bc87ba826dedfb5a4c29d13d40c 100644 (file)
@@ -387,6 +387,7 @@ lto_wpa_write_files (void)
       temp_priority.safe_push (part->insns);
       temp_filenames.safe_push (xstrdup (temp_filename));
     }
+  memory_block_pool::trim (0);
 
   for (int set = 0; set < MAX (lto_parallelism, 1); set++)
     {
index 507feaed157080280f36cbc05725237539656d6f..ebf8cdd1e534064ef00ee557466bee39de5da555 100644 (file)
@@ -28,15 +28,30 @@ memory_block_pool memory_block_pool::instance;
 
 memory_block_pool::memory_block_pool () : m_blocks (NULL) {}
 
-/* Return all blocks from free list to the OS.  */
+/* Reduce free list to NUM blocks and return remaining to malloc.  */
 void
-memory_block_pool::clear_free_list ()
+memory_block_pool::reduce_free_list (int num)
 {
-  while (m_blocks)
+  block_list **blocks = &m_blocks;
+
+  /* First skip NUM blocks.  */
+
+  for (;num > 0 && *blocks; num--)
+    blocks = &(*blocks)->m_next;
+
+  if (!*blocks)
+    return;
+
+  /* And free the remainder of them.  */
+
+  block_list *to_free = *blocks;
+  *blocks = NULL;
+
+  while (to_free)
     {
-      block_list *next = m_blocks->m_next;
-      XDELETEVEC (m_blocks);
-      m_blocks = next;
+      block_list *next = to_free->m_next;
+      XDELETEVEC (to_free);
+      to_free = next;
     }
 }
 
@@ -62,3 +77,10 @@ mempool_obstack_chunk_free (void *chunk)
   else
     XDELETEVEC (chunk);
 }
+
+/* Return allocated memory back to malloc (and to system).  */
+void
+memory_block_pool::trim (int num)
+{
+  instance.reduce_free_list (num);
+}
index 8ebeee0f6ff622248b55743d7825d0526878aac6..a11465b20d6ef6107669b9afc4b69df66debda02 100644 (file)
@@ -28,12 +28,15 @@ class memory_block_pool
 public:
   /* Blocks have fixed size.  This is necessary for sharing.  */
   static const size_t block_size = 64 * 1024;
+  /* Number of blocks we keep in the freelists.  */
+  static const size_t freelist_size = 1024 * 1024 / block_size;
 
   memory_block_pool ();
 
   static inline void *allocate () ATTRIBUTE_MALLOC;
   static inline void release (void *);
-  void clear_free_list ();
+  static void trim (int nblocks = freelist_size);
+  void reduce_free_list (int);
 
 private:
   /* memory_block_pool singleton instance, defined in memory-block.cc.  */