[PATCH] configure: move malloc_trim/tcmalloc/jemalloc to meson

Paolo Bonzini posted 1 patch 2 weeks ago
Test docker-quick@centos7 failed
Test docker-mingw@fedora failed
Test checkpatch failed
Test FreeBSD failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20200916080608.17689-1-pbonzini@redhat.com
configure         | 84 +++++------------------------------------------
meson.build       | 28 +++++++++++++---
meson_options.txt |  5 +++
3 files changed, 38 insertions(+), 79 deletions(-)

[PATCH] configure: move malloc_trim/tcmalloc/jemalloc to meson

Posted by Paolo Bonzini 2 weeks ago
Because LIBS is not used anymore, tcmalloc/jemalloc does
not work with binaries whose description is in Meson.
The fix is simply to move them to Meson too.

For consistency with other configure options, specifying
--enable-malloc-trim together with --enable-{tc,je}malloc
becomes a fatal error.

Reported-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 configure         | 84 +++++------------------------------------------
 meson.build       | 28 +++++++++++++---
 meson_options.txt |  5 +++
 3 files changed, 38 insertions(+), 79 deletions(-)

diff --git a/configure b/configure
index ce27eafb0a..13f53ba231 100755
--- a/configure
+++ b/configure
@@ -540,7 +540,7 @@ skip_meson=no
 gettext=""
 
 bogus_os="no"
-malloc_trim=""
+malloc_trim="auto"
 
 deprecated_features=""
 
@@ -1222,9 +1222,9 @@ for opt do
   ;;
   --enable-tcg) tcg="yes"
   ;;
-  --disable-malloc-trim) malloc_trim="no"
+  --disable-malloc-trim) malloc_trim="disabled"
   ;;
-  --enable-malloc-trim) malloc_trim="yes"
+  --enable-malloc-trim) malloc_trim="enabled"
   ;;
   --disable-spice) spice="no"
   ;;
@@ -4428,77 +4428,14 @@ EOF
   fi
 fi
 
+malloc=system
 if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
     echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
     exit 1
-fi
-
-# Even if malloc_trim() is available, these non-libc memory allocators
-# do not support it.
-if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
-    if test "$malloc_trim" = "yes" ; then
-        echo "Disabling malloc_trim with non-libc memory allocator"
-    fi
-    malloc_trim="no"
-fi
-
-#######################################
-# malloc_trim
-
-if test "$malloc_trim" != "no" ; then
-    cat > $TMPC << EOF
-#include <malloc.h>
-int main(void) { malloc_trim(0); return 0; }
-EOF
-    if compile_prog "" "" ; then
-        malloc_trim="yes"
-    else
-        malloc_trim="no"
-    fi
-fi
-
-##########################################
-# tcmalloc probe
-
-if test "$tcmalloc" = "yes" ; then
-  cat > $TMPC << EOF
-#include <stdlib.h>
-int main(void) {
-    void *tmp = malloc(1);
-    if (tmp != NULL) {
-        return 0;
-    }
-    return 1;
-}
-EOF
-
-  if compile_prog "" "-ltcmalloc" ; then
-    LIBS="-ltcmalloc $LIBS"
-  else
-    feature_not_found "tcmalloc" "install gperftools devel"
-  fi
-fi
-
-##########################################
-# jemalloc probe
-
-if test "$jemalloc" = "yes" ; then
-  cat > $TMPC << EOF
-#include <stdlib.h>
-int main(void) {
-    void *tmp = malloc(1);
-    if (tmp != NULL) {
-        return 0;
-    }
-    return 1;
-}
-EOF
-
-  if compile_prog "" "-ljemalloc" ; then
-    LIBS="-ljemalloc $LIBS"
-  else
-    feature_not_found "jemalloc" "install jemalloc devel"
-  fi
+elif test "$tcmalloc" = "yes" ; then
+    malloc=tcmalloc
+elif test "$jemalloc" = "yes" ; then
+    malloc=jemalloc
 fi
 
 ##########################################
@@ -7023,10 +6960,6 @@ if test "$gbm" = "yes" ; then
 fi
 
 
-if test "$malloc_trim" = "yes" ; then
-  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
-fi
-
 if test "$avx2_opt" = "yes" ; then
   echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
 fi
@@ -8003,6 +7936,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
         -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \
         -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \
         -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
+	-Dmalloc=$malloc -Dmalloc_trim=$malloc_trim \
 	-Dsdl=$sdl -Dsdl_image=$sdl_image \
 	-Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
 	-Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f\
diff --git a/meson.build b/meson.build
index bba766b4bc..d3b1e5c34c 100644
--- a/meson.build
+++ b/meson.build
@@ -439,6 +439,26 @@ keyutils = dependency('libkeyutils', required: false,
 
 has_gettid = cc.has_function('gettid')
 
+# Malloc tests
+
+malloc = []
+if get_option('malloc') == 'system'
+  has_malloc_trim = \
+    not get_option('malloc_trim').disabled() and \
+    cc.compiles('''#include <malloc.h>
+                   int main(void) { malloc_trim(0); return 0; }''')
+else
+  has_malloc_trim = false
+  malloc = cc.find_library(get_option('malloc'), required: true)
+endif
+if not has_malloc_trim and get_option('malloc_trim').enabled()
+  if get_option('malloc') == 'system'
+    error('malloc_trim not available on this platform.')
+  else
+    error('malloc_trim not available with non-libc memory allocator')
+  endif
+endif
+
 # Create config-host.h
 
 config_host_data.set('CONFIG_SDL', sdl.found())
@@ -450,6 +470,7 @@ config_host_data.set('CONFIG_VNC_SASL', sasl.found())
 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
 config_host_data.set('CONFIG_GETTID', has_gettid)
+config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
@@ -818,7 +839,7 @@ util_ss.add_all(trace_ss)
 util_ss = util_ss.apply(config_all, strict: false)
 libqemuutil = static_library('qemuutil',
                              sources: util_ss.sources() + stub_ss.sources() + genh,
-                             dependencies: [util_ss.dependencies(), m, glib, socket])
+                             dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
 qemuutil = declare_dependency(link_with: libqemuutil,
                               sources: genh + version_res)
 
@@ -1442,7 +1463,7 @@ summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
 #  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
 #  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
 #endif
-summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
+summary_info += {'malloc trim support': has_malloc_trim}
 summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
 summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
 summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
@@ -1504,8 +1525,7 @@ summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
 summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
 summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
-summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
-summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
+summary_info += {'memory allocator':  get_option('malloc')}
 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
diff --git a/meson_options.txt b/meson_options.txt
index 543cf70043..894e006799 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -6,6 +6,11 @@ option('docdir', type : 'string', value : 'doc',
 option('gettext', type : 'boolean', value : true,
        description: 'Localization of the GTK+ user interface')
 
+option('malloc_trim', type : 'feature', value : 'auto',
+       description: 'enable libc malloc_trim() for memory optimization')
+option('malloc', type : 'combo', choices : ['system', 'tcmalloc', 'jemalloc'],
+       value: 'system', description: 'choose memory allocator to use')
+
 option('sdl', type : 'feature', value : 'auto',
        description: 'SDL user interface')
 option('sdl_image', type : 'feature', value : 'auto',
-- 
2.26.2


Re: [PATCH] configure: move malloc_trim/tcmalloc/jemalloc to meson

Posted by 罗勇刚 (Yonggang Luo) 1 week ago
On Wed, Sep 16, 2020 at 4:07 PM Paolo Bonzini <pbonzini@redhat.com> wrote:
>
> Because LIBS is not used anymore, tcmalloc/jemalloc does
> not work with binaries whose description is in Meson.
> The fix is simply to move them to Meson too.
>
> For consistency with other configure options, specifying
> --enable-malloc-trim together with --enable-{tc,je}malloc
> becomes a fatal error.
>
> Reported-by: Stefan Hajnoczi <stefanha@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure         | 84 +++++------------------------------------------
>  meson.build       | 28 +++++++++++++---
>  meson_options.txt |  5 +++
>  3 files changed, 38 insertions(+), 79 deletions(-)
>
> diff --git a/configure b/configure
> index ce27eafb0a..13f53ba231 100755
> --- a/configure
> +++ b/configure
> @@ -540,7 +540,7 @@ skip_meson=no
>  gettext=""
>
>  bogus_os="no"
> -malloc_trim=""
> +malloc_trim="auto"
>
>  deprecated_features=""
>
> @@ -1222,9 +1222,9 @@ for opt do
>    ;;
>    --enable-tcg) tcg="yes"
>    ;;
> -  --disable-malloc-trim) malloc_trim="no"
> +  --disable-malloc-trim) malloc_trim="disabled"
>    ;;
> -  --enable-malloc-trim) malloc_trim="yes"
> +  --enable-malloc-trim) malloc_trim="enabled"
>    ;;
>    --disable-spice) spice="no"
>    ;;
> @@ -4428,77 +4428,14 @@ EOF
>    fi
>  fi
>
> +malloc=system
>  if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
>      echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
>      exit 1
> -fi
This patch looks good for me, but I still have a small advice than move
thse judgement from
configure to meson, because finally they need to be converted.
and getting tcmalloc /  jemalloc to be "enabled" "disabled" for consistence


> -
> -# Even if malloc_trim() is available, these non-libc memory allocators
> -# do not support it.
> -if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then
> -    if test "$malloc_trim" = "yes" ; then
> -        echo "Disabling malloc_trim with non-libc memory allocator"
> -    fi
> -    malloc_trim="no"
> -fi
> -
> -#######################################
> -# malloc_trim
> -
> -if test "$malloc_trim" != "no" ; then
> -    cat > $TMPC << EOF
> -#include <malloc.h>
> -int main(void) { malloc_trim(0); return 0; }
> -EOF
> -    if compile_prog "" "" ; then
> -        malloc_trim="yes"
> -    else
> -        malloc_trim="no"
> -    fi
> -fi
> -
> -##########################################
> -# tcmalloc probe
> -
> -if test "$tcmalloc" = "yes" ; then
> -  cat > $TMPC << EOF
> -#include <stdlib.h>
> -int main(void) {
> -    void *tmp = malloc(1);
> -    if (tmp != NULL) {
> -        return 0;
> -    }
> -    return 1;
> -}
> -EOF
> -
> -  if compile_prog "" "-ltcmalloc" ; then
> -    LIBS="-ltcmalloc $LIBS"
> -  else
> -    feature_not_found "tcmalloc" "install gperftools devel"
> -  fi
> -fi
> -
> -##########################################
> -# jemalloc probe
> -
> -if test "$jemalloc" = "yes" ; then
> -  cat > $TMPC << EOF
> -#include <stdlib.h>
> -int main(void) {
> -    void *tmp = malloc(1);
> -    if (tmp != NULL) {
> -        return 0;
> -    }
> -    return 1;
> -}
> -EOF
> -
> -  if compile_prog "" "-ljemalloc" ; then
> -    LIBS="-ljemalloc $LIBS"
> -  else
> -    feature_not_found "jemalloc" "install jemalloc devel"
> -  fi
> +elif test "$tcmalloc" = "yes" ; then
> +    malloc=tcmalloc
> +elif test "$jemalloc" = "yes" ; then
> +    malloc=jemalloc
>  fi
>
>  ##########################################
> @@ -7023,10 +6960,6 @@ if test "$gbm" = "yes" ; then
>  fi
>
>
> -if test "$malloc_trim" = "yes" ; then
> -  echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak
> -fi
> -
>  if test "$avx2_opt" = "yes" ; then
>    echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
>  fi
> @@ -8003,6 +7936,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \
>          -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo
false; fi) \
>          -Db_pie=$(if test "$pie" = yes; then echo true; else echo false;
fi) \
>          -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo
false; fi) \
> +       -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim \
>         -Dsdl=$sdl -Dsdl_image=$sdl_image \
>         -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg
-Dvnc_png=$vnc_png \
>         -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f\
> diff --git a/meson.build b/meson.build
> index bba766b4bc..d3b1e5c34c 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -439,6 +439,26 @@ keyutils = dependency('libkeyutils', required: false,
>
>  has_gettid = cc.has_function('gettid')
>
> +# Malloc tests
> +
> +malloc = []
> +if get_option('malloc') == 'system'
> +  has_malloc_trim = \
> +    not get_option('malloc_trim').disabled() and \
> +    cc.compiles('''#include <malloc.h>
> +                   int main(void) { malloc_trim(0); return 0; }''')
> +else
> +  has_malloc_trim = false
> +  malloc = cc.find_library(get_option('malloc'), required: true)
> +endif
> +if not has_malloc_trim and get_option('malloc_trim').enabled()
> +  if get_option('malloc') == 'system'
> +    error('malloc_trim not available on this platform.')
> +  else
> +    error('malloc_trim not available with non-libc memory allocator')
> +  endif
> +endif
> +
>  # Create config-host.h
>
>  config_host_data.set('CONFIG_SDL', sdl.found())
> @@ -450,6 +470,7 @@ config_host_data.set('CONFIG_VNC_SASL', sasl.found())
>  config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
>  config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
>  config_host_data.set('CONFIG_GETTID', has_gettid)
> +config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
>  config_host_data.set('QEMU_VERSION', '"@0@
"'.format(meson.project_version()))
>  config_host_data.set('QEMU_VERSION_MAJOR',
meson.project_version().split('.')[0])
>  config_host_data.set('QEMU_VERSION_MINOR',
meson.project_version().split('.')[1])
> @@ -818,7 +839,7 @@ util_ss.add_all(trace_ss)
>  util_ss = util_ss.apply(config_all, strict: false)
>  libqemuutil = static_library('qemuutil',
>                               sources: util_ss.sources() +
stub_ss.sources() + genh,
> -                             dependencies: [util_ss.dependencies(), m,
glib, socket])
> +                             dependencies: [util_ss.dependencies(), m,
glib, socket, malloc])
>  qemuutil = declare_dependency(link_with: libqemuutil,
>                                sources: genh + version_res)
>
> @@ -1442,7 +1463,7 @@ summary_info += {'Install blobs':
config_host.has_key('INSTALL_BLOBS')}
>  #  summary_info += {'TCG debug enabled':
config_host.has_key('CONFIG_DEBUG_TCG')}
>  #  summary_info += {'TCG interpreter':
config_host.has_key('CONFIG_TCG_INTERPRETER')}
>  #endif
> -summary_info += {'malloc trim support':
config_host.has_key('CONFIG_MALLOC_TRIM')}
> +summary_info += {'malloc trim support': has_malloc_trim}
>  summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
>  summary_info += {'PVRDMA support':
 config_host.has_key('CONFIG_PVRDMA')}
>  summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
> @@ -1504,8 +1525,7 @@ summary_info += {'lzfse support':
config_host.has_key('CONFIG_LZFSE')}
>  summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
>  summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
>  summary_info += {'libxml2':
config_host.has_key('CONFIG_LIBXML2')}
> -summary_info += {'tcmalloc support':
 config_host.has_key('CONFIG_TCMALLOC')}
> -summary_info += {'jemalloc support':
 config_host.has_key('CONFIG_JEMALLOC')}
> +summary_info += {'memory allocator':  get_option('malloc')}
>  summary_info += {'avx2 optimization':
config_host.has_key('CONFIG_AVX2_OPT')}
>  summary_info += {'avx512f optimization':
config_host.has_key('CONFIG_AVX512F_OPT')}
>  summary_info += {'replication support':
config_host.has_key('CONFIG_REPLICATION')}
> diff --git a/meson_options.txt b/meson_options.txt
> index 543cf70043..894e006799 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -6,6 +6,11 @@ option('docdir', type : 'string', value : 'doc',
>  option('gettext', type : 'boolean', value : true,
>         description: 'Localization of the GTK+ user interface')
>
> +option('malloc_trim', type : 'feature', value : 'auto',
> +       description: 'enable libc malloc_trim() for memory optimization')
> +option('malloc', type : 'combo', choices : ['system', 'tcmalloc',
'jemalloc'],
> +       value: 'system', description: 'choose memory allocator to use')
> +
>  option('sdl', type : 'feature', value : 'auto',
>         description: 'SDL user interface')
>  option('sdl_image', type : 'feature', value : 'auto',
> --
> 2.26.2
>
>


--
         此致
礼
罗勇刚
Yours
    sincerely,
Yonggang Luo

Re: [PATCH] configure: move malloc_trim/tcmalloc/jemalloc to meson

Posted by Paolo Bonzini 1 week ago
On 18/09/20 14:55, 罗勇刚(Yonggang Luo) wrote:
> 
>>  if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then
>>      echo "ERROR: tcmalloc && jemalloc can't be used at the same time"
>>      exit 1
>> -fi
> This patch looks good for me, but I still have a small advice than move
> thse judgement from
> configure to meson, because finally they need to be converted.
> and getting tcmalloc /  jemalloc to be "enabled" "disabled" for consistence
> 

This error cannot apply to meson.build because it uses a single
multi-choice option "-Dmalloc=system|tcmalloc|jemalloc".

Paolo


Re: [PATCH] configure: move malloc_trim/tcmalloc/jemalloc to meson

Posted by Richard Henderson 2 weeks ago
On 9/16/20 1:06 AM, Paolo Bonzini wrote:
> Because LIBS is not used anymore, tcmalloc/jemalloc does
> not work with binaries whose description is in Meson.
> The fix is simply to move them to Meson too.
> 
> For consistency with other configure options, specifying
> --enable-malloc-trim together with --enable-{tc,je}malloc
> becomes a fatal error.
> 
> Reported-by: Stefan Hajnoczi <stefanha@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure         | 84 +++++------------------------------------------
>  meson.build       | 28 +++++++++++++---
>  meson_options.txt |  5 +++
>  3 files changed, 38 insertions(+), 79 deletions(-)

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

r~


Re: [PATCH] configure: move malloc_trim/tcmalloc/jemalloc to meson

Posted by Stefan Hajnoczi 2 weeks ago
On Wed, Sep 16, 2020 at 04:06:08AM -0400, Paolo Bonzini wrote:
> Because LIBS is not used anymore, tcmalloc/jemalloc does
> not work with binaries whose description is in Meson.
> The fix is simply to move them to Meson too.
> 
> For consistency with other configure options, specifying
> --enable-malloc-trim together with --enable-{tc,je}malloc
> becomes a fatal error.
> 
> Reported-by: Stefan Hajnoczi <stefanha@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  configure         | 84 +++++------------------------------------------
>  meson.build       | 28 +++++++++++++---
>  meson_options.txt |  5 +++
>  3 files changed, 38 insertions(+), 79 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>