Ignore:
Timestamp:
Jun 2, 2021, 9:26:00 AM (4 years ago)
Author:
[email protected]
Message:

Convert small JIT pool tests into executable fuzzing
https://bugs.webkit.org/show_bug.cgi?id=226279

Source/JavaScriptCore:

Right now, we try to test our engine on a small JIT pool. This isn't a known configuration for any
actual ports and causes issues if we run out of JIT memory when we need to compile an OSR exit.
Instead of testing such a small pool we should just fuzz each executable allocation that says it
can fail.

The current fuzzing doesn't do a good job tracking the number of DFG/FTL compiles when allocations
fail, so when enabled those tests will just exit early. Also, right now we use a random seed picked
by the engine for these tests, which makes it hard to reproduce crashes on the bots. If we see
flakiness on the bots we can have the harness pass in a number so it gets logged in the repro command.

Reviewed by Michael Saboff.

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::numberOfDFGCompiles):

  • jit/ExecutableAllocationFuzz.cpp:

(JSC::doExecutableAllocationFuzzing):

  • jsc.cpp:

(runJSC):

Tools:

Reviewed by Michael Saboff.

Right now, we try to test our engine on a small JIT pool. This isn't a known configuration for any
actual ports and causes issues if we run out of JIT memory when we need to compile an OSR exit.
Instead of testing such a small pool we should just fuzz each executable allocation that says it
can fail.

The current fuzzing doesn't do a good job tracking the number of DFG/FTL compiles when allocations
fail, so when enabled those tests will just exit early. Also, right now we use a random seed picked
by the engine for these tests, which makes it hard to reproduce crashes on the bots. If we see
flakiness on the bots we can have the harness pass in a number so it gets logged in the repro command.

  • Scripts/jsc-stress-test-helpers/js-executable-allocation-fuzz:
  • Scripts/run-jsc-stress-tests:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/jit/ExecutableAllocationFuzz.cpp

    r191058 r278356  
    3030#include <wtf/Atomics.h>
    3131#include <wtf/DataLog.h>
     32#include <wtf/WeakRandom.h>
    3233
    3334namespace JSC {
     
    4142ExecutableAllocationFuzzResult doExecutableAllocationFuzzing()
    4243{
     44    static WeakRandom random(Options::seedOfVMRandomForFuzzer() ? Options::seedOfVMRandomForFuzzer() : cryptographicallyRandomNumber());
     45
    4346    ASSERT(Options::useExecutableAllocationFuzz());
    4447   
    45     unsigned oldValue;
    46     unsigned newValue;
    47     do {
    48         oldValue = s_numberOfExecutableAllocationFuzzChecks.load();
    49         newValue = oldValue + 1;
    50     } while (!s_numberOfExecutableAllocationFuzzChecks.compareExchangeWeak(oldValue, newValue));
    51    
    52     if (newValue == Options::fireExecutableAllocationFuzzAt()) {
     48    unsigned numChecks = s_numberOfExecutableAllocationFuzzChecks.value++;
     49
     50    if (numChecks == Options::fireExecutableAllocationFuzzAt()) {
    5351        if (Options::verboseExecutableAllocationFuzz()) {
    5452            dataLog("Will pretend to fail executable allocation.\n");
     
    5755        return PretendToFailExecutableAllocation;
    5856    }
    59    
     57
    6058    if (Options::fireExecutableAllocationFuzzAtOrAfter()
    61         && newValue >= Options::fireExecutableAllocationFuzzAtOrAfter()) {
     59        && numChecks >= Options::fireExecutableAllocationFuzzAtOrAfter()) {
    6260        if (Options::verboseExecutableAllocationFuzz()) {
    6361            dataLog("Will pretend to fail executable allocation.\n");
     
    6563        }
    6664        return PretendToFailExecutableAllocation;
    67     }
     65    } else if (!Options::fireExecutableAllocationFuzzAt() && random.getUint32() < UINT_MAX * Options::randomIntegrityAuditRate())
     66        return PretendToFailExecutableAllocation;
    6867   
    6968    return AllowNormalExecutableAllocation;
Note: See TracChangeset for help on using the changeset viewer.