• Sean Christopherson's avatar
    KVM: nVMX: add tracepoint for failed nested VM-Enter · 5497b955
    Sean Christopherson authored
    Debugging a failed VM-Enter is often like searching for a needle in a
    haystack, e.g. there are over 80 consistency checks that funnel into
    the "invalid control field" error code.  One way to expedite debug is
    to run the buggy code as an L1 guest under KVM (and pray that the
    failing check is detected by KVM).  However, extracting useful debug
    information out of L0 KVM requires attaching a debugger to KVM and/or
    modifying the source, e.g. to log which check is failing.
    
    Make life a little less painful for VMM developers and add a tracepoint
    for failed VM-Enter consistency checks.  Ideally the tracepoint would
    capture both what check failed and precisely why it failed, but logging
    why a checked failed is difficult to do in a generic tracepoint without
    resorting to invasive techniques, e.g. generating a custom string on
    failure.  That being said, for the vast majority of VM-Enter failures
    the most difficult step is figuring out exactly what to look at, e.g.
    figuring out which bit was incorrectly set in a control field is usually
    not too painful once the guilty field as been identified.
    
    To reach a happy medium between precision and ease of use, simply log
    the code that detected a failed check, using a macro to execute the
    check and log the trace event on failure.  This approach enables tracing
    arbitrary code, e.g. it's not limited to function calls or specific
    formats of checks, and the changes to the existing code are minimally
    invasive.  A macro with a two-character name is desirable as usage of
    the macro doesn't result in overly long lines or confusing alignment,
    while still retaining some amount of readability.  I.e. a one-character
    name is a little too terse, and a three-character name results in the
    contents being passed to the macro aligning with an indented line when
    the macro is used an in if-statement, e.g.:
    
            if (VCC(nested_vmx_check_long_line_one(...) &&
                    nested_vmx_check_long_line_two(...)))
                    return -EINVAL;
    
    And that is the story of how the CC(), a.k.a. Consistency Check, macro
    got its name.
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    5497b955
nested.c 183 KB