Message ID | 20200916080608.17689-1-pbonzini@redhat.com |
---|---|
State | New |
Headers | show |
Series | configure: move malloc_trim/tcmalloc/jemalloc to meson | expand |
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>
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~
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 <div dir="ltr"><br><br>On Wed, Sep 16, 2020 at 4:07 PM Paolo Bonzini <<a href="mailto:pbonzini@redhat.com">pbonzini@redhat.com</a>> wrote:<br>><br>> Because LIBS is not used anymore, tcmalloc/jemalloc does<br>> not work with binaries whose description is in Meson.<br>> The fix is simply to move them to Meson too.<br>><br>> For consistency with other configure options, specifying<br>> --enable-malloc-trim together with --enable-{tc,je}malloc<br>> becomes a fatal error.<br>><br>> Reported-by: Stefan Hajnoczi <<a href="mailto:stefanha@redhat.com">stefanha@redhat.com</a>><br>> Signed-off-by: Paolo Bonzini <<a href="mailto:pbonzini@redhat.com">pbonzini@redhat.com</a>><br>> ---<br>> configure | 84 +++++------------------------------------------<br>> meson.build | 28 +++++++++++++---<br>> meson_options.txt | 5 +++<br>> 3 files changed, 38 insertions(+), 79 deletions(-)<br>><br>> diff --git a/configure b/configure<br>> index ce27eafb0a..13f53ba231 100755<br>> --- a/configure<br>> +++ b/configure<br>> @@ -540,7 +540,7 @@ skip_meson=no<br>> gettext=""<br>><br>> bogus_os="no"<br>> -malloc_trim=""<br>> +malloc_trim="auto"<br>><br>> deprecated_features=""<br>><br>> @@ -1222,9 +1222,9 @@ for opt do<br>> ;;<br>> --enable-tcg) tcg="yes"<br>> ;;<br>> - --disable-malloc-trim) malloc_trim="no"<br>> + --disable-malloc-trim) malloc_trim="disabled"<br>> ;;<br>> - --enable-malloc-trim) malloc_trim="yes"<br>> + --enable-malloc-trim) malloc_trim="enabled"<br>> ;;<br>> --disable-spice) spice="no"<br>> ;;<br>> @@ -4428,77 +4428,14 @@ EOF<br>> fi<br>> fi<br>><br>> +malloc=system<br>> if test "$tcmalloc" = "yes" && test "$jemalloc" = "yes" ; then<br>> echo "ERROR: tcmalloc && jemalloc can't be used at the same time"<br>> exit 1<br>> -fi<div>This patch looks good for me, but I still have a small advice than move thse judgement from</div><div>configure to meson, because finally they need to be converted.</div><div>and getting tcmalloc / jemalloc to be "enabled" "disabled" for consistence</div><div><br></div><div><br></div><div>> -<br>> -# Even if malloc_trim() is available, these non-libc memory allocators<br>> -# do not support it.<br>> -if test "$tcmalloc" = "yes" || test "$jemalloc" = "yes" ; then<br>> - if test "$malloc_trim" = "yes" ; then<br>> - echo "Disabling malloc_trim with non-libc memory allocator"<br>> - fi<br>> - malloc_trim="no"<br>> -fi<br>> -<br>> -#######################################<br>> -# malloc_trim<br>> -<br>> -if test "$malloc_trim" != "no" ; then<br>> - cat > $TMPC << EOF<br>> -#include <malloc.h><br>> -int main(void) { malloc_trim(0); return 0; }<br>> -EOF<br>> - if compile_prog "" "" ; then<br>> - malloc_trim="yes"<br>> - else<br>> - malloc_trim="no"<br>> - fi<br>> -fi<br>> -<br>> -##########################################<br>> -# tcmalloc probe<br>> -<br>> -if test "$tcmalloc" = "yes" ; then<br>> - cat > $TMPC << EOF<br>> -#include <stdlib.h><br>> -int main(void) {<br>> - void *tmp = malloc(1);<br>> - if (tmp != NULL) {<br>> - return 0;<br>> - }<br>> - return 1;<br>> -}<br>> -EOF<br>> -<br>> - if compile_prog "" "-ltcmalloc" ; then<br>> - LIBS="-ltcmalloc $LIBS"<br>> - else<br>> - feature_not_found "tcmalloc" "install gperftools devel"<br>> - fi<br>> -fi<br>> -<br>> -##########################################<br>> -# jemalloc probe<br>> -<br>> -if test "$jemalloc" = "yes" ; then<br>> - cat > $TMPC << EOF<br>> -#include <stdlib.h><br>> -int main(void) {<br>> - void *tmp = malloc(1);<br>> - if (tmp != NULL) {<br>> - return 0;<br>> - }<br>> - return 1;<br>> -}<br>> -EOF<br>> -<br>> - if compile_prog "" "-ljemalloc" ; then<br>> - LIBS="-ljemalloc $LIBS"<br>> - else<br>> - feature_not_found "jemalloc" "install jemalloc devel"<br>> - fi<br>> +elif test "$tcmalloc" = "yes" ; then<br>> + malloc=tcmalloc<br>> +elif test "$jemalloc" = "yes" ; then<br>> + malloc=jemalloc<br>> fi<br>><br>> ##########################################<br>> @@ -7023,10 +6960,6 @@ if test "$gbm" = "yes" ; then<br>> fi<br>><br>><br>> -if test "$malloc_trim" = "yes" ; then<br>> - echo "CONFIG_MALLOC_TRIM=y" >> $config_host_mak<br>> -fi<br>> -<br>> if test "$avx2_opt" = "yes" ; then<br>> echo "CONFIG_AVX2_OPT=y" >> $config_host_mak<br>> fi<br>> @@ -8003,6 +7936,7 @@ NINJA=${ninja:-$PWD/ninjatool} $meson setup \<br>> -Dstrip=$(if test "$strip_opt" = yes; then echo true; else echo false; fi) \<br>> -Db_pie=$(if test "$pie" = yes; then echo true; else echo false; fi) \<br>> -Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \<br>> + -Dmalloc=$malloc -Dmalloc_trim=$malloc_trim \<br>> -Dsdl=$sdl -Dsdl_image=$sdl_image \<br>> -Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \<br>> -Dgettext=$gettext -Dxkbcommon=$xkbcommon -Du2f=$u2f\<br>> diff --git a/meson.build b/meson.build<br>> index bba766b4bc..d3b1e5c34c 100644<br>> --- a/meson.build<br>> +++ b/meson.build<br>> @@ -439,6 +439,26 @@ keyutils = dependency('libkeyutils', required: false,<br>><br>> has_gettid = cc.has_function('gettid')<br>><br>> +# Malloc tests<br>> +<br>> +malloc = []<br>> +if get_option('malloc') == 'system'<br>> + has_malloc_trim = \<br>> + not get_option('malloc_trim').disabled() and \<br>> + cc.compiles('''#include <malloc.h><br>> + int main(void) { malloc_trim(0); return 0; }''')<br>> +else<br>> + has_malloc_trim = false<br>> + malloc = cc.find_library(get_option('malloc'), required: true)<br>> +endif<br>> +if not has_malloc_trim and get_option('malloc_trim').enabled()<br>> + if get_option('malloc') == 'system'<br>> + error('malloc_trim not available on this platform.')<br>> + else<br>> + error('malloc_trim not available with non-libc memory allocator')<br>> + endif<br>> +endif<br>> +<br>> # Create config-host.h<br>><br>> config_host_data.set('CONFIG_SDL', sdl.found())<br>> @@ -450,6 +470,7 @@ config_host_data.set('CONFIG_VNC_SASL', sasl.found())<br>> config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())<br>> config_host_data.set('CONFIG_KEYUTILS', keyutils.found())<br>> config_host_data.set('CONFIG_GETTID', has_gettid)<br>> +config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)<br>> config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))<br>> config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])<br>> config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])<br>> @@ -818,7 +839,7 @@ util_ss.add_all(trace_ss)<br>> util_ss = util_ss.apply(config_all, strict: false)<br>> libqemuutil = static_library('qemuutil',<br>> sources: util_ss.sources() + stub_ss.sources() + genh,<br>> - dependencies: [util_ss.dependencies(), m, glib, socket])<br>> + dependencies: [util_ss.dependencies(), m, glib, socket, malloc])<br>> qemuutil = declare_dependency(link_with: libqemuutil,<br>> sources: genh + version_res)<br>><br>> @@ -1442,7 +1463,7 @@ summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}<br>> # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}<br>> # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}<br>> #endif<br>> -summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}<br>> +summary_info += {'malloc trim support': has_malloc_trim}<br>> summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}<br>> summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}<br>> summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}<br>> @@ -1504,8 +1525,7 @@ summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}<br>> summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}<br>> summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}<br>> summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}<br>> -summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}<br>> -summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}<br>> +summary_info += {'memory allocator': get_option('malloc')}<br>> summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}<br>> summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}<br>> summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}<br>> diff --git a/meson_options.txt b/meson_options.txt<br>> index 543cf70043..894e006799 100644<br>> --- a/meson_options.txt<br>> +++ b/meson_options.txt<br>> @@ -6,6 +6,11 @@ option('docdir', type : 'string', value : 'doc',<br>> option('gettext', type : 'boolean', value : true,<br>> description: 'Localization of the GTK+ user interface')<br>><br>> +option('malloc_trim', type : 'feature', value : 'auto',<br>> + description: 'enable libc malloc_trim() for memory optimization')<br>> +option('malloc', type : 'combo', choices : ['system', 'tcmalloc', 'jemalloc'],<br>> + value: 'system', description: 'choose memory allocator to use')<br>> +<br>> option('sdl', type : 'feature', value : 'auto',<br>> description: 'SDL user interface')<br>> option('sdl_image', type : 'feature', value : 'auto',<br>> --<br>> 2.26.2<br>><br>><br><br><br>--<br> 此致<br>礼<br>罗勇刚<br>Yours<br> sincerely,<br>Yonggang Luo</div></div>
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
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',
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(-)