From: "peterzhu2118 (Peter Zhu)" Date: 2021-12-16T14:44:47+00:00 Subject: [ruby-core:106713] [Ruby master Bug#18133] LTO: TestGCCompact#test_ast_compacts segfaults on i686 Issue #18133 has been updated by peterzhu2118 (Peter Zhu). Thank you for checking the patch! Historically, Ruby has been using 16KB pages, so there's assumptions in the GC about this. This wasn't a problem on 64KB page size systems when we were using `posix_memalign`, but we can no longer use that with compaction (the change from `posix_memalign` to `mmap` was made this year). I will look into allocating pages larger than 16KB so we can use `mmap` on these platforms. ---------------------------------------- Bug #18133: LTO: TestGCCompact#test_ast_compacts segfaults on i686 https://bugs.ruby-lang.org/issues/18133#change-95397 * Author: vo.x (Vit Ondruch) * Status: Assigned * Priority: Normal * ruby -v: ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [i386-linux] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- I observe following segfault running the test suite on i686 on RHEL9: ~~~ $ gdb --args ./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext -- --disable-gems ./test/runner.rb --excludes-dir=./test/excludes -v ... snip ... (gdb) handle SIGPIPE noprint nostop pass Signal Stop Print Pass to program Description SIGPIPE No No Yes Broken pipe (gdb) r ... snip ... [ 8347/20497] TestGBK#test_mbc_enc_len = 0.00 s [ 8348/20497] TestGBK#test_mbc_to_code = 0.00 s [ 8349/20497] TestGCCompact#test_ast_compacts--Type for more, q to quit, c to continue without paging-- Thread 1 "ruby" received signal SIGSEGV, Segmentation fault. 0xf7e33fe6 in rb_class_remove_from_super_subclasses (klass=) at /builddir/build/BUILD/ruby-3.0.2/class.c:96 96 RCLASS_EXT(entry->next->klass)->parent_subclasses = RCLASS_EXT(klass)->parent_subclasses; (gdb) bt #0 0xf7e33fe6 in rb_class_remove_from_super_subclasses (klass=) at /builddir/build/BUILD/ruby-3.0.2/class.c:96 #1 obj_free (obj=, objspace=0x5655ac30) at /builddir/build/BUILD/ruby-3.0.2/gc.c:3019 #2 gc_page_sweep (sweep_page=0x5a40e1f0, heap=0x5655ac48, objspace=0x5655ac30) at /builddir/build/BUILD/ruby-3.0.2/gc.c:4914 #3 gc_sweep_step.isra.0 (objspace=, heap=) at /builddir/build/BUILD/ruby-3.0.2/gc.c:5134 #4 0xf7ca3f09 in gc_sweep_rest (objspace=) at /builddir/build/BUILD/ruby-3.0.2/gc.c:5190 #5 gc_sweep (objspace=0x5655ac30) at /builddir/build/BUILD/ruby-3.0.2/gc.c:5313 #6 0xf7ca8250 in gc_marks (full_mark=, objspace=) at /builddir/build/BUILD/ruby-3.0.2/gc.c:7504 #7 gc_start (objspace=, reason=) at /builddir/build/BUILD/ruby-3.0.2/gc.c:8322 #8 0xf7ca8530 in garbage_collect (objspace=objspace@entry=0x5655ac30, reason=reason@entry=238592) at /builddir/build/BUILD/ruby-3.0.2/gc.c:8210 #9 0xf7caa723 in gc_start_internal (compact=2, immediate_sweep=2, immediate_mark=2, full_mark=2, self=1448715280, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/gc.c:8553 #10 gc_compact (ec=0x5655afac, self=1448715280) at /builddir/build/BUILD/ruby-3.0.2/gc.c:9468 #11 0xf7dfae3c in invoke_bf (argv=0x0, bf=, reg_cfp=, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:5583 #12 vm_invoke_builtin_delegate (ec=0x5655afac, cfp=, bf=, start_index=0) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:5607 #13 0xf7e0664c in vm_exec_core (ec=0x0, initial=1448732852) at /builddir/build/BUILD/ruby-3.0.2/insns.def:1482 #14 0xf7e1d0d5 in rb_vm_exec (ec=, mjit_enable_p=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:2172 #15 0xf7e0c3c9 in invoke_block (captured=, captured=, opt_pc=, type=, cref=0x0, self=1450588460, iseq=0x5669174c, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:399 #16 invoke_iseq_block_from_c (me=0x0, is_lambda=, cref=0x0, passed_block_handler=0, kw_splat=0, argv=0xffffbf00, argc=1, self=1450588460, captured=, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1335 #17 invoke_block_from_c_bh (force_blockarg=, is_lambda=, cref=, passed_block_handler=, kw_splat=, argv=, argc=, block_handler=, ec=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1353 #18 vm_yield (kw_splat=0, argv=0xffffbf00, argc=1, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1398 #19 rb_yield_0 (argv=0xffffbf00, argc=1) at /builddir/build/BUILD/ruby-3.0.2/vm_eval.c:1333 #20 rb_yield (val=) at /builddir/build/BUILD/ruby-3.0.2/vm_eval.c:1349 #21 0xf7c2ae74 in rb_ary_collect (ary=1503666180) at /builddir/build/BUILD/ruby-3.0.2/array.c:3635 #22 0xf7dfc835 in vm_call_cfunc_with_frame (ec=0x5655afac, reg_cfp=0xf77f6d70, calling=0xffffc004) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:2929 #23 0xf7dfdd31 in vm_sendish (ec=0x5655afac, reg_cfp=0xf77f6d70, cd=0x566c8f00, block_handler=4152323453, method_explorer=mexp_search_method) at /builddir/build/BUILD/ruby-3.0.2/vm_callinfo.h:336 #24 0xf7e0590a in vm_exec_core (ec=0x0, initial=1448732852) at /builddir/build/BUILD/ruby-3.0.2/insns.def:770 #25 0xf7e1d0d5 in rb_vm_exec (ec=, mjit_enable_p=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:2172 #26 0xf7e0c3c9 in invoke_block (captured=, captured=, opt_pc=, type=, cref=0x0, self=1450588460, iseq=0x56691850, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:399 #27 invoke_iseq_block_from_c (me=0x0, is_lambda=, cref=0x0, passed_block_handler=0, kw_splat=0, argv=0xffffc2b0, argc=1, self=1450588460, captured=, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1335 #28 invoke_block_from_c_bh (force_blockarg=, is_lambda=, cref=, passed_block_handler=, kw_splat=, argv=, argc=, block_handler=, ec=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1353 #29 vm_yield (kw_splat=0, argv=0xffffc2b0, argc=1, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1398 #30 rb_yield_0 (argv=0xffffc2b0, argc=1) at /builddir/build/BUILD/ruby-3.0.2/vm_eval.c:1333 #31 rb_yield (val=) at /builddir/build/BUILD/ruby-3.0.2/vm_eval.c:1349 #32 0xf7c2ac4a in rb_ary_each (ary=) at /builddir/build/BUILD/ruby-3.0.2/array.c:2523 #33 rb_ary_each (ary=1501058480) at /builddir/build/BUILD/ruby-3.0.2/array.c:2517 #34 0xf7dfc835 in vm_call_cfunc_with_frame (ec=0x5655afac, reg_cfp=0xf77f6dfc, calling=0xffffc474) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:2929 #35 0xf7e00602 in vm_call_method_each_type (ec=0x5655afac, cfp=0xf77f6dfc, calling=0xffffc474) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:3419 #36 0xf7e00a46 in vm_call_refined (calling=, cfp=0xf77f6dfc, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:3398 #37 vm_call_method_each_type (ec=0x5655afac, cfp=0xf77f6dfc, calling=) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:3476 #38 0xf7dfdd31 in vm_sendish (ec=0x5655afac, reg_cfp=0xf77f6dfc, cd=0x5669f510, block_handler=4152323593, method_explorer=mexp_search_method) at /builddir/build/BUILD/ruby-3.0.2/vm_callinfo.h:336 #39 0xf7e0590a in vm_exec_core (ec=0x0, initial=1448732852) at /builddir/build/BUILD/ruby-3.0.2/insns.def:770 #40 0xf7e1d0d5 in rb_vm_exec (ec=, mjit_enable_p=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:2172 #41 0xf7e0c3c9 in invoke_block (captured=, captured=, opt_pc=, type=, cref=0x0, self=1450588460, iseq=0x566900cc, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:399 #42 invoke_iseq_block_from_c (me=0x0, is_lambda=, cref=0x0, passed_block_handler=0, kw_splat=0, argv=0xffffc720, argc=1, self=1450588460, captured=, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1335 #43 invoke_block_from_c_bh (force_blockarg=, is_lambda=, cref=, passed_block_handler=, kw_splat=, argv=, argc=, block_handler=, ec=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1353 #44 vm_yield (kw_splat=0, argv=0xffffc720, argc=1, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm.c:1398 #45 rb_yield_0 (argv=0xffffc720, argc=1) at /builddir/build/BUILD/ruby-3.0.2/vm_eval.c:1333 #46 rb_yield (val=) at /builddir/build/BUILD/ruby-3.0.2/vm_eval.c:1349 #47 0xf7c2ac4a in rb_ary_each (ary=) at /builddir/build/BUILD/ruby-3.0.2/array.c:2523 --Type for more, q to quit, c to continue without paging-- #48 rb_ary_each (ary=1501058920) at /builddir/build/BUILD/ruby-3.0.2/array.c:2517 #49 0xf7dfc835 in vm_call_cfunc_with_frame (ec=0x5655afac, reg_cfp=0xf77f6ec0, calling=0xffffc8e4) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:2929 #50 0xf7e00602 in vm_call_method_each_type (ec=0x5655afac, cfp=0xf77f6ec0, calling=0xffffc8e4) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:3419 #51 0xf7e00a46 in vm_call_refined (calling=, cfp=0xf77f6ec0, ec=0x5655afac) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:3398 #52 vm_call_method_each_type (ec=0x5655afac, cfp=0xf77f6ec0, calling=) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:3476 #53 0xf7dfdd31 in vm_sendish (ec=0x5655afac, reg_cfp=0xf77f6ec0, cd=0x566cbca0, block_handler=4152323789, method_explorer=mexp_search_method) at /builddir/build/BUILD/ruby-3.0.2/vm_callinfo.h:336 #54 0xf7e0590a in vm_exec_core (ec=0x0, initial=1448732852) at /builddir/build/BUILD/ruby-3.0.2/insns.def:770 #55 0xf7e1d0d5 in rb_vm_exec (ec=, mjit_enable_p=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:2172 #56 0xf7e1da4e in rb_iseq_eval (iseq=0x5657ad18) at /builddir/build/BUILD/ruby-3.0.2/vm.c:2409 #57 0xf7cdb23e in load_iseq_eval (ec=0x5655afac, fname=) at /builddir/build/BUILD/ruby-3.0.2/load.c:594 #58 0xf7ce0ef8 in require_internal (ec=, fname=, exception=) at /builddir/build/BUILD/ruby-3.0.2/load.c:1065 #59 0xf7ce10ce in rb_require_string (fname=1448587920) at /builddir/build/BUILD/ruby-3.0.2/load.c:1142 #60 0xf7ce117c in rb_f_require_relative (obj=1448845900, fname=1448588380) at /builddir/build/BUILD/ruby-3.0.2/load.c:857 #61 0xf7dfc835 in vm_call_cfunc_with_frame (ec=0x5655afac, reg_cfp=0xf77f6fd8, calling=0xffffce04) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:2929 #62 0xf7e00602 in vm_call_method_each_type (ec=0x5655afac, cfp=0xf77f6fd8, calling=0xffffce04) at /builddir/build/BUILD/ruby-3.0.2/vm_insnhelper.c:3419 #63 0xf7dfdd31 in vm_sendish (ec=0x5655afac, reg_cfp=0xf77f6fd8, cd=0x56616828, block_handler=0, method_explorer=mexp_search_method) at /builddir/build/BUILD/ruby-3.0.2/vm_callinfo.h:336 #64 0xf7e04d92 in vm_exec_core (ec=0x0, initial=1448732852) at /builddir/build/BUILD/ruby-3.0.2/insns.def:789 #65 0xf7e1d0d5 in rb_vm_exec (ec=, mjit_enable_p=) at /builddir/build/BUILD/ruby-3.0.2/vm.c:2172 #66 0xf7e1db19 in rb_iseq_eval_main (iseq=0x5657b63c) at /builddir/build/BUILD/ruby-3.0.2/vm.c:2420 #67 0xf7c91b99 in rb_ec_exec_node (ec=ec@entry=0x5655afac, n=n@entry=0x5657b63c) at /builddir/build/BUILD/ruby-3.0.2/eval.c:317 #68 0xf7c964fa in ruby_run_node (n=0x5657b63c) at /builddir/build/BUILD/ruby-3.0.2/eval.c:375 #69 0x56556143 in main (argc=, argv=) at ./main.c:50 ~~~ Unfortunately: 1) I don' have better reproducer then to run the whole test suite and even then it is not triggered always. I was not successful to hit the issue running just the single test case or the test file. 2) I have failed to reproduce this on CentOS Stream 9, which is surprising. Luckily, I can reproduce it on my system. This is seems to be related to LTO, because I have never faced such issue with LTO disabled. ---Files-------------------------------- mmap.patch (9.45 KB) mmap.patch (11.1 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: