• Tony Luck's avatar
    x86/split_lock: Make life miserable for split lockers · b041b525
    Tony Luck authored
    In https://lore.kernel.org/all/87y22uujkm.ffs@tglx/ Thomas
    said:
    
      Its's simply wishful thinking that stuff gets fixed because of a
      WARN_ONCE(). This has never worked. The only thing which works is to
      make stuff fail hard or slow it down in a way which makes it annoying
      enough to users to complain.
    
    He was talking about WBINVD. But it made me think about how we use the
    split lock detection feature in Linux.
    
    Existing code has three options for applications:
    
     1) Don't enable split lock detection (allow arbitrary split locks)
     2) Warn once when a process uses split lock, but let the process
        keep running with split lock detection disabled
     3) Kill process that use split locks
    
    Option 2 falls into the "wishful thinking" territory that Thomas warns does
    nothing. But option 3 might not be viable in a situation with legacy
    applications that need to run.
    
    Hence make option 2 much stricter to "slow it down in a way which makes
    it annoying".
    
    Primary reason for this change is to provide better quality of service to
    the rest of the applications running on the system. Internal testing shows
    that even with many processes splitting locks, performance for the rest of
    the system is much more responsive.
    
    The new "warn" mode operates like this.  When an application tries to
    execute a bus lock the #AC handler.
    
     1) Delays (interruptibly) 10 ms before moving to next step.
    
     2) Blocks (interruptibly) until it can get the semaphore
    	If interrupted, just return. Assume the signal will either
    	kill the task, or direct execution away from the instruction
    	that is trying to get the bus lock.
     3) Disables split lock detection for the current core
     4) Schedules a work queue to re-enable split lock detect in 2 jiffies
     5) Returns
    
    The work queue that re-enables split lock detection also releases the
    semaphore.
    
    There is a corner case where a CPU may be taken offline while split lock
    detection is disabled. A CPU hotplug handler handles this case.
    
    Old behaviour was to only print the split lock warning on the first
    occurrence of a split lock from a task. Preserve that by adding a flag to
    the task structure that suppresses subsequent split lock messages from that
    task.
    Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Link: https://lore.kernel.org/r/20220310204854.31752-2-tony.luck@intel.com
    b041b525
fork.c 79 KB