On November 21, 2019 9:27:15 PM GMT+01:00, Jan Hubicka <hubi...@ucw.cz> wrote: >Hi, >here is updated patch. Bootstrapped/regtested x86_64-linux, OK?
Ok. Richard. >Honza > > * 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. >Index: ggc-page.c >=================================================================== >--- ggc-page.c (revision 278570) >+++ ggc-page.c (working copy) >@@ -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: lto/lto.c >=================================================================== >--- lto/lto.c (revision 278570) >+++ lto/lto.c (working copy) >@@ -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: memory-block.cc >=================================================================== >--- memory-block.cc (revision 278570) >+++ memory-block.cc (working copy) >@@ -28,15 +28,30 @@ memory_block_pool memory_block_pool::ins > > 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: memory-block.h >=================================================================== >--- memory-block.h (revision 278570) >+++ memory-block.h (working copy) >@@ -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. >*/