| .. SPDX-License-Identifier: GPL-2.0 | 
 |  | 
 | .. include:: <isonum.txt> | 
 |  | 
 | =============================== | 
 | Bus lock detection and handling | 
 | =============================== | 
 |  | 
 | :Copyright: |copy| 2021 Intel Corporation | 
 | :Authors: - Fenghua Yu <fenghua.yu@intel.com> | 
 |           - Tony Luck <tony.luck@intel.com> | 
 |  | 
 | Problem | 
 | ======= | 
 |  | 
 | A split lock is any atomic operation whose operand crosses two cache lines. | 
 | Since the operand spans two cache lines and the operation must be atomic, | 
 | the system locks the bus while the CPU accesses the two cache lines. | 
 |  | 
 | A bus lock is acquired through either split locked access to writeback (WB) | 
 | memory or any locked access to non-WB memory. This is typically thousands of | 
 | cycles slower than an atomic operation within a cache line. It also disrupts | 
 | performance on other cores and brings the whole system to its knees. | 
 |  | 
 | Detection | 
 | ========= | 
 |  | 
 | Intel processors may support either or both of the following hardware | 
 | mechanisms to detect split locks and bus locks. | 
 |  | 
 | #AC exception for split lock detection | 
 | -------------------------------------- | 
 |  | 
 | Beginning with the Tremont Atom CPU split lock operations may raise an | 
 | Alignment Check (#AC) exception when a split lock operation is attemped. | 
 |  | 
 | #DB exception for bus lock detection | 
 | ------------------------------------ | 
 |  | 
 | Some CPUs have the ability to notify the kernel by an #DB trap after a user | 
 | instruction acquires a bus lock and is executed. This allows the kernel to | 
 | terminate the application or to enforce throttling. | 
 |  | 
 | Software handling | 
 | ================= | 
 |  | 
 | The kernel #AC and #DB handlers handle bus lock based on the kernel | 
 | parameter "split_lock_detect". Here is a summary of different options: | 
 |  | 
 | +------------------+----------------------------+-----------------------+ | 
 | |split_lock_detect=|#AC for split lock		|#DB for bus lock	| | 
 | +------------------+----------------------------+-----------------------+ | 
 | |off	  	   |Do nothing			|Do nothing		| | 
 | +------------------+----------------------------+-----------------------+ | 
 | |warn		   |Kernel OOPs			|Warn once per task and | | 
 | |(default)	   |Warn once per task and	|and continues to run.  | | 
 | |		   |disable future checking	|			| | 
 | |		   |When both features are	|			| | 
 | |		   |supported, warn in #AC	|			| | 
 | +------------------+----------------------------+-----------------------+ | 
 | |fatal		   |Kernel OOPs			|Send SIGBUS to user.	| | 
 | |		   |Send SIGBUS to user		|			| | 
 | |		   |When both features are	|			| | 
 | |		   |supported, fatal in #AC	|			| | 
 | +------------------+----------------------------+-----------------------+ | 
 | |ratelimit:N	   |Do nothing			|Limit bus lock rate to	| | 
 | |(0 < N <= 1000)   |				|N bus locks per second	| | 
 | |		   |				|system wide and warn on| | 
 | |		   |				|bus locks.		| | 
 | +------------------+----------------------------+-----------------------+ | 
 |  | 
 | Usages | 
 | ====== | 
 |  | 
 | Detecting and handling bus lock may find usages in various areas: | 
 |  | 
 | It is critical for real time system designers who build consolidated real | 
 | time systems. These systems run hard real time code on some cores and run | 
 | "untrusted" user processes on other cores. The hard real time cannot afford | 
 | to have any bus lock from the untrusted processes to hurt real time | 
 | performance. To date the designers have been unable to deploy these | 
 | solutions as they have no way to prevent the "untrusted" user code from | 
 | generating split lock and bus lock to block the hard real time code to | 
 | access memory during bus locking. | 
 |  | 
 | It's also useful for general computing to prevent guests or user | 
 | applications from slowing down the overall system by executing instructions | 
 | with bus lock. | 
 |  | 
 |  | 
 | Guidance | 
 | ======== | 
 | off | 
 | --- | 
 |  | 
 | Disable checking for split lock and bus lock. This option can be useful if | 
 | there are legacy applications that trigger these events at a low rate so | 
 | that mitigation is not needed. | 
 |  | 
 | warn | 
 | ---- | 
 |  | 
 | A warning is emitted when a bus lock is detected which allows to identify | 
 | the offending application. This is the default behavior. | 
 |  | 
 | fatal | 
 | ----- | 
 |  | 
 | In this case, the bus lock is not tolerated and the process is killed. | 
 |  | 
 | ratelimit | 
 | --------- | 
 |  | 
 | A system wide bus lock rate limit N is specified where 0 < N <= 1000. This | 
 | allows a bus lock rate up to N bus locks per second. When the bus lock rate | 
 | is exceeded then any task which is caught via the buslock #DB exception is | 
 | throttled by enforced sleeps until the rate goes under the limit again. | 
 |  | 
 | This is an effective mitigation in cases where a minimal impact can be | 
 | tolerated, but an eventual Denial of Service attack has to be prevented. It | 
 | allows to identify the offending processes and analyze whether they are | 
 | malicious or just badly written. | 
 |  | 
 | Selecting a rate limit of 1000 allows the bus to be locked for up to about | 
 | seven million cycles each second (assuming 7000 cycles for each bus | 
 | lock). On a 2 GHz processor that would be about 0.35% system slowdown. |