• Cliff Wickman's avatar
    x86/uv: Work around UV2 BAU hangs · 8b6e511e
    Cliff Wickman authored
    On SGI's UV2 the BAU (Broadcast Assist Unit) driver can hang
    under a heavy load. To cure this:
    
    - Disable the UV2 extended status mode (see UV2_EXT_SHFT), as
      this mode changes BAU behavior in more ways then just delivering
      an extra bit of status.  Revert status to just two meaningful bits,
      like UV1.
    
    - Use no IPI-style resets on UV2.  Just give up the request for
      whatever the reason it failed and let it be accomplished with
      the legacy IPI method.
    
    - Use no alternate sending descriptor (the former UV2 workaround
      bcp->using_desc and handle_uv2_busy() stuff).  Just disable the
      use of the BAU for a period of time in favor of the legacy IPI
      method when the h/w bug leaves a descriptor busy.
    
      -- new tunable: giveup_limit determines the threshold at which a hub is
         so plugged that it should do all requests with the legacy IPI method for a
         period of time
      -- generalize disable_for_congestion() (renamed disable_for_period()) for
         use whenever a hub should avoid using the BAU for a period of time
    
    Also:
    
     - Fix find_another_by_swack(), which is part of the UV2 bug workaround
    
     - Correct and clarify the statistics (new stats s_overipilimit, s_giveuplimit,
       s_enters, s_ipifordisabled, s_plugged, s_congested)
    Signed-off-by: default avatarCliff Wickman <cpw@sgi.com>
    Link: http://lkml.kernel.org/r/20120622131459.GC31884@sgi.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    8b6e511e
uv_bau.h 24.2 KB