aboutsummaryrefslogtreecommitdiffstats
path: root/mjit_worker.c
Commit message (Collapse)AuthorAgeFilesLines
* Avoid hanging on --jit-wait after MJIT.pauseTakashi Kokubun2021-01-031-1/+1
| | | | When a worker is stopped, nobody will JIT a method for you.
* Stop managing valid class serialsTakashi Kokubun2020-12-291-13/+0
| | | | `mjit_valid_class_serial_p` has no longer been used since b9007b6c548.
* Mark an ISeq being JIT-edTakashi Kokubun2020-12-201-0/+5
| | | | | This is to avoid SEGV on a CC reference in a normal compilation https://github.com/ruby/ruby/runs/1586578023
* Lazily move units from active_units to stale_unitsTakashi Kokubun2020-12-161-7/+19
| | | | | | to avoid SEGV like http://ci.rvm.jp/results/trunk-mjit@phosphorus-docker/3289588 by a race condition between mjit_recompile and compation around active_units
* Lock only active_units referencesTakashi Kokubun2020-12-141-1/+4
| | | | | | 556a7285080c1344c75bb93a333c9bfc5d631c61 was not good maybe because it wasn't using list_for_each_safe. If list_for_each_safe is safe for list_del for any nodes (is that true?), this should be fine.
* Lock GC while searching the best iseqTakashi Kokubun2020-12-111-1/+11
| | | | | To fix http://ci.rvm.jp/results/trunk-mjit-wait@phosphorus-docker/3286265
* Revert "Revert some recent JIT changes"Takashi Kokubun2020-12-101-1/+14
| | | | | | This reverts commit b7dc04e51823f9fe8b5355c30a304ecdb11fe5ed. This should be fine, rather necessary, too.
* Revert "Revert "Have list_node at the top of rb_mjit_unit""Takashi Kokubun2020-12-101-1/+1
| | | | | | This reverts commit 73b07c437e24711c23dd2dd01d3ffc5f1012e046. This was, of course, innocent.
* Use list_for_each_safe when list_del is used insideTakashi Kokubun2020-12-101-3/+3
| | | | list_for_each seems to cause all the SEGVs we've seen.
* Revert some recent JIT changesTakashi Kokubun2020-12-071-14/+1
| | | | | | | | | | | | | | | | | Revert "Lock the entire active_units loop" This reverts commit 5c2ff88be2e515613dfe54823e8429656f688e9f. Revert "Lock active_units references on compaction" This reverts commit 556a7285080c1344c75bb93a333c9bfc5d631c61. Revert "Wait for GC before unload_units" This reverts commit a8f16df615daa55901bb351efe038e86b61fbb92. Well, the previous revert actually didn't fix it, but this series of reverts seems to rollback the situation a little.
* Revert "Have list_node at the top of rb_mjit_unit"Takashi Kokubun2020-12-071-1/+1
| | | | | | | This reverts commit 3319ce37651aa7e50c31b5fba14871938318b37a. I still haven't figured out why, but this seems to have increased the failure rate.
* Wait for GC before unload_unitsTakashi Kokubun2020-12-071-1/+12
|
* Lock the entire active_units loopTakashi Kokubun2020-12-071-3/+0
| | | | The previous fix seems not working. Let me test if this works.
* Have list_node at the top of rb_mjit_unitTakashi Kokubun2020-12-071-1/+1
| | | | to convert list_node to rb_mjit_unit easily in gdb.
* Lock active_units references on compactionTakashi Kokubun2020-12-061-0/+5
| | | | This might race with mjit_recompile.
* Do not throttle the workaround for --jit-waitTakashi Kokubun2020-11-281-5/+4
| | | | | --jit-wait CI can be stuck when the workaround is throttled http://ci.rvm.jp/results/trunk-mjit-wait@phosphorus-docker/3274091
* Throttle JIT compactionTakashi Kokubun2020-11-271-4/+7
| | | | | | | The compilation for JIT compaction is very heavy. Triggering a second compaction to include one more new method is probably not worth it. So this triggers JIT compaction for ten more new methods after each compaction.
* Throttle unload_unitsTakashi Kokubun2020-11-271-5/+11
| | | | | | | | | | Because d80226e7bd often reduces the number of unloaded units, it increases the number of unload_units calls, which are heavy. To mitigate that, this throttles unload_units per `max_cache_size / 10`. Also hoping to fix https://ci.appveyor.com/project/ruby/ruby/builds/36552382/job/kjmjgw9cjyf2ksd7
* Avoid unloading units which have enough total_callsTakashi Kokubun2020-11-271-19/+25
| | | | instead of just unloading worst 10% methods.
* Log when JIT compaction is skipped due to ISeq GCTakashi Kokubun2020-11-271-1/+4
|
* Run unload_units in the JIT worker threadTakashi Kokubun2020-11-271-10/+104
| | | | | | | | to avoid "Too many JIT code, but skipped unloading units for JIT compaction". Now we can forget the `in_compact` locking. Moving some functions from mjit.c to mjit_worker.c because mjit_worker.c should have functions executed in the JIT worker.
* Suppress a format-overflow warningNobuyoshi Nakada2020-11-231-2/+5
|
* Stop leaving .c files for JIT compaction in /tmp (#3802)Takashi Kokubun2020-11-221-54/+52
| | | | | | | | | * Re-generate C files for JIT compaction every time * Refactor in_jit return logic * Just write code in a single file * Add a TODO comment [ci skip]
* Clarify the intention of the include guardTakashi Kokubun2020-11-211-2/+2
| | | | This was a leftover of 27d5af59a359909e0d434459c30cfc0940f60a5b.
* Make c_file / so_file construction consistentTakashi Kokubun2020-11-211-23/+9
| | | | | | | convert_unit_to_func's c_func / so_func construction is unnecessarily complicated while it's not really safer than what compact_all_jit_code does. So I changed convert_unit_to_func to be consistent with compact_all_jit_code.
* Make sure all threads are scanned on unload_unitsTakashi Kokubun2020-11-211-1/+1
| | | | | | | | | | | This has been a TODO since 79df14c04b. While adcf0316d1 covered the root_fiber of the initial thread, it didn't cover root_fibers of other threads. Now it's hooked properly in rb_threadptr_root_fiber_setup. With regards to "XXX: Is this mjit_cont `mjit_cont_free`d?", when rb_threadptr_root_fiber_release is called, although I'm not sure when th->root_fiber is truthy, fiber_free seems to call cont_free and mjit_cont_free. So mjit_conts of root_fibers seem to be freed properly.
* Remove the unused o_file definitionTakashi Kokubun2020-11-211-9/+0
| | | | It's calculated inside compile_c_to_so again.
* Fix wrong #ifdef usages with #ifTakashi Kokubun2020-11-201-7/+7
| | | | Apparently #ifdef is always true
* Unify some confusing macro usagesTakashi Kokubun2020-11-201-19/+19
| | | | | | | | | | | | | | _MSC_VER used to be the macro to switch JIT compaction. However, since d4381d2ceb, the correct macro to switch it was changed from _MSC_VER to _WIN32. As I didn't properly replace all relevant _MSC_VER usages to _WIN32, these macros have been used inconsistently. nobu replaced _WIN32 with USE_HEADER_TRANSFORMATION in 5eb446d12f3. Therefore we had USE_HEADER_TRANSFORMATION and _MSC_VER. This commit makes sure such inconsistent _MSC_VER usages will be unified to the new header, also renaming it to USE_JIT_COMPACTION to be more precise about the requirements. The header transformation itself is not quite relevant to places changed in this commit.
* Shrink the blocking region for compile_compact_jit_codeTakashi Kokubun2020-11-201-4/+3
| | | | | | | | Isn't setting `in_compact = true` enough to avoid a race condition between JIT compaction and unload_units? Now I think it is. This change will make it easier to spend more time on compile_compact_jit_code. For now it seems to take only 0.0723ms though.
* Eliminate IVC sync between JIT and Ruby threads (#3799)Takashi Kokubun2020-11-201-70/+0
| | | | Thanks to Ractor (https://github.com/ruby/ruby/pull/2888 and https://github.com/ruby/ruby/pull/3662), inline caches support parallel access now.
* Revert "Add assertions when inline caches are copied to MJIT"Aaron Patterson2020-10-221-11/+0
| | | | | | | | This reverts commit 6cb6d5abc36ede9d5158c2cd90734134838e6bfb. This reverts commit 1484b786aee8d411a9e2278ac6d6e44aedbf6662. I think we don't need these assertions anymore. I believe the problem is solved by abf678a4397c6c00a1bb686043e377d372e695a4
* Use a lock level for a less granular lock.Aaron Patterson2020-10-221-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | We are seeing an error where code that is generated with MJIT contains references to objects that have been moved. I believe this is due to a race condition in the compaction function. `gc_compact` has two steps: 1. Run a full GC to pin objects 2. Compact / update references Step one is executed with `garbage_collect`. `garbage_collect` calls `gc_enter` / `gc_exit`, these functions acquire a JIT lock and release a JIT lock. So a lock is held for the duration of step 1. Step two is executed by `gc_compact_after_gc`. It also holds a JIT lock. I believe the problem is that the JIT is free to execute between step 1 and step 2. It copies call cache values, but doesn't pin them when it copies them. So the compactor thinks it's OK to move the call cache even though it is not safe. We need to hold a lock for the duration of `garbage_collect` *and* `gc_compact_after_gc`. This patch introduces a lock level which increments and decrements. The compaction function can increment and decrement the lock level and prevent MJIT from executing during both steps.
* Suppress warningsKazuhiro NISHIYAMA2020-09-301-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ``` compiling ../mjit.c In file included from ../mjit.c:28: ../mjit_worker.c:1270:33: warning: incompatible pointer to integer conversion passing 'const struct rb_callcache *' to parameter of type 'VALUE' (aka 'unsigned long') [-Wint-conversion] assert(BUILTIN_TYPE(cc) != T_MOVED); ^~ /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/assert.h:93:25: note: expanded from macro 'assert' (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0) ^ ../include/ruby/internal/value_type.h:153:23: note: passing argument to parameter 'obj' here RB_BUILTIN_TYPE(VALUE obj) ^ In file included from ../mjit.c:28: ../mjit_worker.c:1271:33: warning: incompatible pointer to integer conversion passing 'const struct rb_callable_method_entry_struct *' to parameter of type 'VALUE' (aka 'unsigned long') [-Wint-conversion] assert(BUILTIN_TYPE(vm_cc_cme(cc)) != T_MOVED); ^~~~~~~~~~~~~ /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/assert.h:93:25: note: expanded from macro 'assert' (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0) ^ ../include/ruby/internal/value_type.h:153:23: note: passing argument to parameter 'obj' here RB_BUILTIN_TYPE(VALUE obj) ^ In file included from ../mjit.c:28: ../mjit_worker.c:1272:50: warning: incompatible pointer to integer conversion passing 'const struct rb_callcache *' to parameter of type 'VALUE' (aka 'unsigned long') [-Wint-conversion] assert(!rb_objspace_garbage_object_p(cc)); ^~ /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/assert.h:93:25: note: expanded from macro 'assert' (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0) ^ ../gc.h:128:40: note: passing argument to parameter 'obj' here int rb_objspace_garbage_object_p(VALUE obj); ^ In file included from ../mjit.c:28: ../mjit_worker.c:1273:50: warning: incompatible pointer to integer conversion passing 'const struct rb_callable_method_entry_struct *' to parameter of type 'VALUE' (aka 'unsigned long') [-Wint-conversion] assert(!rb_objspace_garbage_object_p(vm_cc_cme(cc))); ^~~~~~~~~~~~~ /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/assert.h:93:25: note: expanded from macro 'assert' (__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0) ^ ../gc.h:128:40: note: passing argument to parameter 'obj' here int rb_objspace_garbage_object_p(VALUE obj); ^ 4 warnings generated. ```
* Add assertions when inline caches are copied to MJITAaron Patterson2020-09-181-0/+11
| | | | | | This is a temporary commit to try to find a GC issue. It seems like mjit is pointing at a moved address in the call cache. I want to assert that they aren't TMOVED or garbage objects at the time they get copied
* sed -i s/RUBY3/RBIMPL/g卜部昌平2020-05-111-1/+1
| | | | | Devs do not love "3". The only exception is RUBY3_KEYWORDS in parse.y, which seems unrelated to our interests.
* mjit_worker.c: compile_compact_jit_code is not used on mingwNobuyoshi Nakada2020-05-091-2/+10
|
* Revert 0776198486 for Solaris debugTakashi Kokubun2020-05-031-5/+1
| | | | | | | | For some reason 0776198486 didn't fail https://rubyci.org/logs/rubyci.s3.amazonaws.com/solaris10-gcc/ruby-master/log/20200503T230004Z.log.html.gz even while it was before 9aa5fe1bf8. Anyway, there's no need to keep the change anymore.
* Test no .dSYM on macOSTakashi Kokubun2020-05-031-1/+2
| | | | I think 9aa5fe1bf89db8cd215b24d8ddfb668714681b83 helps this issue too.
* Split compile and link for MinGW supportTakashi Kokubun2020-05-031-13/+28
| | | | | | | | MinGW test_jit fails with no error message. Perhaps linker flags should not be passed when compilation is happening. Anyway splitting these stages doesn't matter for performance. So let me just split it to fix the issue. Probably this helps Solaris's issue too.
* Debug Solaris's MJIT failureTakashi Kokubun2020-05-031-1/+5
| | | | | | using -Winvalid-pch https://rubyci.org/logs/rubyci.s3.amazonaws.com/solaris10-gcc/ruby-master/log/20200501T170004Z.fail.html.gz
* Support cc_added_args againTakashi Kokubun2020-05-031-1/+1
| | | | This support was accidentally removed in 818d6d33368a396d9cd3d1a34a84015a9e76c5c8.
* Avoid infinite times of JIT compactionTakashi Kokubun2020-05-021-3/+9
| | | | | | | It's to avoid memory leak for actual usage (because they don't get unloaded properly), but also for fixing CI timed out due to JIT compaction taking too long time on --jit-wait (which runs every time) http://ci.rvm.jp/results/trunk-mjit-wait@silicon-docker/2911601
* Stop generating MJIT_PCH include guardTakashi Kokubun2020-05-011-0/+4
| | | | | | | to fix https://ci.appveyor.com/project/ruby/ruby/builds/32577700/job/yh61rom35wt2uv39 It was for JIT compaction, and we don't support it on mswin.
* c_file_access_mode should be defined for WindowsTakashi Kokubun2020-05-011-8/+11
| | | | | | as well. And also unit->c_file doesn't exist in mswin. https://github.com/ruby/ruby/runs/635915704
* Deduplicate functions in compacted JIT codeTakashi Kokubun2020-05-011-76/+77
| | | | | | | | | | | | | | to improve code locality. Using benchmark-driver/sinatra with 100 methods JIT-ed, [Before] 12149.97 rps 1.3M /tmp/_ruby_mjit_p31171u145.so [After] 12818.83 rps 260K /tmp/_ruby_mjit_p32155u145.so (VM is 13714.89 rps)
* Include unit id in a function name of an inlined methodTakashi Kokubun2020-04-301-1/+1
| | | | | I'm trying to make it possible to include all JIT-ed code in a single C file. This is needed to guarantee uniqueness of all function names
* Do not stop the world during JIT compactionTakashi Kokubun2020-04-301-8/+10
| | | | | | | | | | Running C compiler for JIT compaction inside a critical section may lock main thread for a long time when it triggers GC. As I'm planning to increase this duration a bit, I'd like to make sure this doesn't stop the world. For now, I chose to give up unloading units when it's during JIT compaction, assuming other calls may unload them later.
* mjit_worker: __GNUC__ is too lax卜部昌平2020-04-101-1/+1
| | | | Namely icc defines __GNUC__, but doesn't have -Wdeprecated-declarations
* Get rid of bogus warning by VCNobuyoshi Nakada2020-03-171-1/+2
| | | | | | | | | ``` c:\projects\ruby\mjit_worker.c(1219) : warning C4090: 'function' : different 'const' qualifiers ``` It seems confused by passing "pointer to pointer to const object", not "pointer to const object".