Skip to content

ppc/ppc64 coroutines: save/restore CR as well #13007

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

barracuda156
Copy link
Contributor

Corresponding change for ppc64le: d8a2159

@nobu @ioquatix

@ioquatix
Copy link
Member

Thanks, have you tested it?

@barracuda156
Copy link
Contributor Author

Thanks, have you tested it?

Fiber test in basic test suite passes (though it passed before this change likewise).

Could you suggest some more specific test case to run?

@ioquatix
Copy link
Member

I would just run the entire CRuby test suite, if it passes, it is probably okay.

I am happy to merge this on the basis that it only affects older PPC architecture, and I trust that if there are issues you will follow up (as I'm sure you are a consumer of this code).

@ioquatix
Copy link
Member

Ah, do we also need to update enum { COROUTINE_REGISTERS?

@ioquatix ioquatix self-requested a review March 29, 2025 20:14
@ioquatix ioquatix self-assigned this Mar 29, 2025
@nobu
Copy link
Member

nobu commented Apr 2, 2025

Does ppc64le also need similar fix?

@barracuda156
Copy link
Contributor Author

barracuda156 commented Apr 2, 2025

I would just run the entire CRuby test suite, if it passes, it is probably okay.

I recall there were unrelated issues with some tests, but I will try (and maybe we can fix something on the way).

P. S. BTW since recently I cannot build Ruby from master due to some gem failing in the very end of the build. Tried a few times, it seems to be still broken. This was the last commit that still worked: 7ed08c4

@ioquatix
Copy link
Member

ioquatix commented Apr 3, 2025

I am okay if you confirmed the tests on an older build + this PR.

@barracuda156
Copy link
Contributor Author

@ioquatix @nobu So here is the result for master from 7ed08c4 with the patch from this PR applied:

Driver is ruby 3.5.0dev (2025-04-09) +PRISM [ppc-darwin10.0]
Target is ruby 3.5.0dev (2025-04-09) +PRISM [ppc-darwin10.0]

test_attr.rb              PASS 3
test_autoload.rb          PASS 8
test_block.rb             PASS 58
test_class.rb             PASS 48
test_constant_cache.rb    PASS 10
test_env.rb               PASS 2
test_eval.rb              PASS 49
test_exception.rb         PASS 34
test_fiber.rb             PASS 6
test_finalizer.rb         PASS 2
test_flip.rb              PASS 1
test_flow.rb              PASS 62
test_fork.rb              PASS 5
test_gc.rb                PASS 2
test_insns.rb             PASS 399
test_io.rb                PASS 18
test_jump.rb              PASS 29
test_literal.rb           PASS 157
test_literal_suffix.rb    PASS 48
test_load.rb              PASS 2
test_marshal.rb           PASS 1
test_massign.rb           PASS 34
test_method.rb            PASS 247
test_objectspace.rb       PASS 6
test_proc.rb              PASS 37
test_ractor.rb            PASS 119
test_rjit.rb              PASS 7
test_string.rb            PASS 1
test_struct.rb            PASS 1
test_syntax.rb            PASS 164
test_thread.rb            PASS 50
test_yjit.rb              PASS 356
test_yjit_30k_ifelse.rb   PASS 1
test_yjit_30k_methods.rb  PASS 1
test_yjit_rust_port.rb    PASS 38
 
Finished in 326.92 sec

Fiber count: 10000 (skipping)
PASS all 2006 tests
exec ./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems "./bootstraptest/runner.rb" --ruby="ruby3.5 --disable-gems"   ./KNOWNBUGS.rb
2025-04-09 07:13:25 +0800
Driver is ruby 3.5.0dev (2025-04-09) +PRISM [ppc-darwin10.0]
Target is ruby 3.5.0dev (2025-04-09) +PRISM [ppc-darwin10.0]


No tests, no problem
Checking leaked global symbols...none
/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby
test succeeded
Run options: 
  --seed=18679
  "--ruby=./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems"

# Running tests:

[ 44/201] TestParallel::TestParallel#test_hungup = 3.36 s                             
  1) Error:
TestParallel::TestParallel#test_hungup:
ArgumentError: invalid byte sequence in UTF-8
    /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-7ed08c4fd31c53d4c4e3713c390daff8064d2a52/tool/test/testunit/test_parallel.rb:211:in 'TestParallel::TestParallel#test_hungup'
    ./tool/test/runner.rb:14:in '<main>'

[ 45/201] TestParallel::TestParallel#test_retry_workers = 4.02 s   
  2) Error:
TestParallel::TestParallel#test_retry_workers:
ArgumentError: invalid byte sequence in UTF-8
    /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-7ed08c4fd31c53d4c4e3713c390daff8064d2a52/tool/test/testunit/test_parallel.rb:218:in 'TestParallel::TestParallel#test_retry_workers'
    ./tool/test/runner.rb:14:in '<main>'

Finished tests in 20.456444s, 9.8258 tests/s, 42.1872 assertions/s.                   
201 tests, 863 assertions, 0 failures, 2 errors, 20 skips

ruby -v: ruby 3.5.0dev (2025-04-09) +PRISM [ppc-darwin10.0]
gmake: *** [[uncommon.mk:945](http://uncommon.mk:945/): yes-test-tool] Error 2

@barracuda156
Copy link
Contributor Author

@ioquatix BTW, though unrelated to this PR, maybe you could say why this keeps failing with newer Ruby master (this is the build, not tests):

/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/fileutils.rb:1625:in 'File.stat': No such file or directory @ rb_file_s_stat - /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/.bundle/gems/irb-1.15.1/lib/English.rb (Errno::ENOENT)

Where it happens:

installing binary commands:         /opt/local/bin
installing base libraries:          /opt/local/lib
installing arch files:              /opt/local/lib/ruby3.5/3.5.0+0/ppc-darwin10.0
installing pkgconfig data:          /opt/local/lib/pkgconfig
installing extension objects:       /opt/local/lib/ruby3.5/3.5.0+0/ppc-darwin10.0
installing extension objects:       /opt/local/lib/ruby3.5/site_ruby/3.5.0+0/ppc-darwin10.0
installing extension objects:       /opt/local/lib/ruby3.5/vendor_ruby/3.5.0+0/ppc-darwin10.0
installing extension headers:       /opt/local/include/ruby-3.5.0/ppc-darwin10.0
installing extension scripts:       /opt/local/lib/ruby3.5/3.5.0+0
installing extension scripts:       /opt/local/lib/ruby3.5/site_ruby/3.5.0+0
installing extension scripts:       /opt/local/lib/ruby3.5/vendor_ruby/3.5.0+0
installing extension headers:       /opt/local/include/ruby-3.5.0/ruby
installing command scripts:         /opt/local/bin
installing library scripts:         /opt/local/lib/ruby3.5/3.5.0+0
installing common headers:          /opt/local/include/ruby-3.5.0
installing manpages:                /opt/local/share/man/man1
installing default gems from lib:   /opt/local/lib/ruby3.5/gems/3.5.0+0
                                    bundler [2.7.0.dev](http://2.7.0.dev/)
                                    cgi 0.4.2
                                    delegate 0.4.0
                                    did_you_mean 2.0.0
                                    english 0.8.0
                                    erb 4.0.4
                                    error_highlight 0.7.0
                                    fileutils 1.7.3
                                    find 0.2.0
                                    forwardable 1.3.3
                                    ipaddr 1.2.7
                                    net-http 0.6.0
                                    net-protocol 0.2.2
                                    open-uri 0.5.0
                                    open3 0.2.1
                                    optparse 0.7.0.dev.1
                                    pp 0.6.2
                                    prettyprint 0.2.0
                                    prism 1.3.0
                                    resolv 0.6.0
                                    ruby2_keywords 0.0.5
                                    securerandom 0.4.1
                                    set 1.1.1
                                    shellwords 0.2.2
                                    singleton 0.3.0
                                    syntax_suggest 2.0.2
                                    tempfile 0.3.1
                                    time 0.4.1
                                    timeout 0.4.3
                                    tmpdir 0.3.1
                                    tsort 0.2.0
                                    un 0.3.0
                                    uri 1.0.3
                                    weakref 0.1.3
                                    yaml 0.4.0
installing default gems from ext:   /opt/local/lib/ruby3.5/gems/3.5.0+0
                                    date 3.4.1
                                    digest 3.2.0
                                    etc 1.4.5
                                    fcntl 1.2.0
                                    io-console 0.8.0
                                    io-nonblock 0.3.1
                                    io-wait 0.3.1
                                    json 2.10.2
                                    openssl 3.3.0
                                    pathname 0.4.0
                                    psych 5.2.3
                                    stringio [3.1.6.dev](http://3.1.6.dev/)
                                    strscan 3.1.2
                                    zlib 3.2.1
installing bundled gems:            /opt/local/lib/ruby3.5/gems/3.5.0+0
                                    minitest 5.25.5
                                    power_assert 2.0.5
                                    rake 13.2.1
                                    test-unit 3.6.7
                                    rexml 3.4.1
                                    rss 0.3.1
                                    net-ftp 0.3.8
                                    net-imap 0.5.6
                                    net-pop 0.1.2
                                    net-smtp 0.5.1
                                    matrix 0.4.2
                                    prime 0.1.3
                                    rbs 3.8.1
                                    typeprof 0.30.1
                                    debug 1.10.0
                                    racc 1.8.1
                                    mutex_m 0.3.0
                                    getoptlong 0.2.1
                                    base64 0.2.0
                                    bigdecimal 3.1.9
                                    observer 0.1.2
                                    abbrev 0.1.2
                                    resolv-replace 0.1.1
                                    rinda 0.2.0
                                    drb 2.2.1
                                    nkf 0.2.0
                                    syslog 0.3.0
                                    csv 3.3.2
                                    repl_type_completor 0.1.10
                                    ostruct 0.6.1
                                    pstore 0.2.0
                                    benchmark 0.4.0
                                    logger 1.6.6
                                    rdoc 6.12.0
                                    irb 1.15.1
/opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/fileutils.rb:1625:in 'File.stat': No such file or directory @ rb_file_s_stat - /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/.bundle/gems/irb-1.15.1/lib/English.rb (Errno::ENOENT)
    from /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/fileutils.rb:1625:in 'block in FileUtils#install'
    from /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/fileutils.rb:2471:in 'block in FileUtils#fu_each_src_dest'
    from /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/fileutils.rb:2487:in 'FileUtils#fu_each_src_dest0'
    from /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/fileutils.rb:2469:in 'FileUtils#fu_each_src_dest'
    from /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/fileutils.rb:1624:in 'FileUtils#install'
    from ./tool/rbinstall.rb:216:in 'Object#install'
    from ./tool/rbinstall.rb:692:in 'block in RbInstall::DirPackage#extract_files'
    from ./tool/rbinstall.rb:687:in 'Array#each'
    from ./tool/rbinstall.rb:687:in 'RbInstall::DirPackage#extract_files'
    from /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/rubygems/installer.rb:853:in 'Gem::Installer#extract_files'
    from /opt/local/var/macports/build/_opt_local_ppcports_lang_ruby-devel/ruby-devel/work/ruby-efb2d4363709b36a205791787f6812259027c6e1/lib/rubygems/installer.rb:312:in 'Gem::Installer#install'
    from ./tool/rbinstall.rb:744:in 'block in RbInstall::UnpackedInstaller#install'
    from ./tool/rbinstall.rb:532:in 'RbInstall.no_write'
    from ./tool/rbinstall.rb:744:in 'RbInstall::UnpackedInstaller#install'
    from ./tool/rbinstall.rb:1170:in 'block (2 levels) in <main>'
    from ./tool/rbinstall.rb:1134:in 'IO.foreach'
    from ./tool/rbinstall.rb:1134:in 'block in <main>'
    from ./tool/rbinstall.rb:1219:in 'block in <main>'
    from ./tool/rbinstall.rb:1216:in 'Array#each'
    from ./tool/rbinstall.rb:1216:in '<main>'
gmake: *** [[uncommon.mk:487](http://uncommon.mk:487/): do-install-nodoc] Error 1

@ioquatix
Copy link
Member

ioquatix commented Apr 9, 2025

@barracuda156 thanks for testing this.

I don't have the ability to test PPC build and/or test issues, sorry. However, maybe consider opening a separate issue or bugs.ruby-lang.org issue?

Regarding this:

enum {
  COROUTINE_REGISTERS =
  20  /* 19 general purpose registers (r13-r31) and 1 return address */
  + 4  /* space for fiber_entry() to store the link register */
};

Do we need to update it from 20 to 21 (and the relevant documentation)? Maybe the same for ppc64 too? Actually, I don't understand what the +4 is for - we don't seem to use it. Is it a guard on returning from the start coroutine?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

3 participants