The search for the correct amount of split-lock misery
The problem with atomic operations that cross cache-line boundaries is that the system bus must take special measures to ensure that both cache lines are simultaneously protected from concurrent access. In practice, that means locking the bus for the duration of the operation, which can stall every other processor in the system. A malicious program executing a tight loop with a split-lock operation can destroy the performance of the system as a whole. For this reason, split-lock operations have long been frowned upon.
Unfortunately, software that is malicious (or just poorly written) turns out to be remarkably indifferent to even the most severe of frowns. So, starting in 2019, kernel developers sought more persuasive ways to get their point across. The initial work was done by Fenghua Yu but, in the end, this patch by Peter Zijlstra was merged in January 2020 for the 5.7 kernel release. It gives the kernel the ability to respond to traps caused by split-lock operations and provides three modes for that response, selectable by the split_lock_detect= command-line parameter:
- off causes the kernel to behave as it did before; split-lock operations are not detected and nothing is done when they occur.
- warn (the default) causes a (rate-limited) warning to go to the system log when a split-lock operation is detected.
- fatal causes the kernel to immediately kill (with SIGBUS) any process attempting split-lock operations.
The hope was that the warn mode would be sufficient to alert users to the problem, and lead to software being fixed, while not actually interfering with anybody's use of their systems. By the time the 5.19 development cycle came around earlier this year, though, it seemed that little progress toward the removal of split lock operations had been made, and the denial-of-service problem was as present as before. So it was decided to take a stronger stance against split locks.
One option, of course, would be to just switch to the fatal mode by default, but that would be a rather draconian solution. Instead, Tony Luck wrote a patch with the descriptive title of "make life miserable for split lockers". It modified the warn mode to punish processes doing split locks without actually killing them. Instead, detection of a split lock would lead to a 10ms delay, then serialization via a semaphore. When this mode is selected, a malicious program performing split locks succeeds in slowing itself down, but no longer has much effect on the system as a whole. This change was applied during the 5.19 merge window.
In mid-September, a GitHub user named "pibberflibbits" posted a bug
report saying that the performance of the God of War
game on Linux had become "insanely low
". It took a little
while, but the
participants in the resulting discussion eventually figured out that the
problem was the split-lock penalty. Evidently one cannot be a proper god
of war using just ordinary locks, so the game does a lot of split locking.
Luck's patch had achieved its intended purpose; God of War players are now
suitably miserable.
Guilherme G. Piccoli, though, was not celebrating this victory over the
Gods; instead, he posted a
patch arguing that "it seems unacceptable to regress old/proprietary
userspace programs through a default configuration that previously
worked
". This patch restored the old behavior of the warn
mode and added a new seq mode that would slow down split-lock
users like warn mode does now. The warn mode would
remain the default, lifting the misery from the game-playing world.
Opinions on this change were mixed. Luck pointed out that gamers can simply disable split-lock detection by rebooting with split_lock_detect=off on the kernel command line. If the seq mode were to be added, he said, it should be the default. He also suggested filing a bug with the publishers of God of War to get its misbehavior fixed.
Others disagreed, though. Joshua Ashton argued
that the problem is more widespread: "It's not just about God of War
specifically. There are many old
titles that will never, ever, get updated to fix this problem.
These titles worked perfectly fine and were performant before.
"
Others pointed out that many gamers are unlikely to be comfortable with
adjusting kernel command-line parameters.
Dave Hansen observed
that the misery-inflicting mode had worked as intended and had brought the
problem to light. Even so, he continued:
My gut says we should keep the warnings and kill the misery. The folks who are going to be able to fix the issues are probably also the ones looking at dmesg and don't need the extra hint from the misery. The folks running Windows games don't look at dmesg and just want to play their game without misery.
Luck, though, argued
that split locking creates its own misery for processes other than the one
responsible, and that the current mode "serves a very useful purpose on
multi-user systems
". He suggested that perhaps some sort of heuristic
could be developed to confine the misery to multi-user systems.
The definitive answer,
though, came from Thomas Gleixner, who pointed out that slowing down split
lockers by default is the only choice that distributors could make;
anything else creates an easily exploitable denial-of-service
vulnerability. So the slowdown
needs to remain: "Attack vector prevention has precedence over broken
applications
". He did suggest, though, that a sysctl knob could be
added to control split-lock detection; that would allow users of broken
applications to get their performance back without the need to figure out
how to change command-line parameters or reboot their systems.
That is the approach that Piccoli has taken for his
second attempt at addressing the problem. The new
kernel.split_lock_mitigate knob, if set to zero, will disable the
penalization of processes using split locking (while retaining the warning
sent to the system log). The default is to retain the slowdown. This
patch seems to have pleased everybody
involved and looks likely to find its way into the 6.2 kernel. Affected
gamers will have to set the new knob appropriately, but knowing which
sysctls to tweak could be said to be part of being a true God of War.
| Index entries for this article | |
|---|---|
| Kernel | Architectures/x86 |
Posted Oct 19, 2022 16:27 UTC (Wed)
by iabervon (subscriber, #722)
[Link]
It seems like it might be sufficient to just remove the explicit delay; you'd still be heavily penalizing processes that do split-lock operations, but only if there's anything else for them to contend with, so they'd be unaffected if they have a whole computer to themselves.
Posted Oct 19, 2022 16:53 UTC (Wed)
by epa (subscriber, #39769)
[Link] (14 responses)
Posted Oct 19, 2022 17:08 UTC (Wed)
by mb (subscriber, #50428)
[Link]
Posted Oct 19, 2022 17:44 UTC (Wed)
by mss (subscriber, #138799)
[Link] (12 responses)
Posted Oct 19, 2022 19:37 UTC (Wed)
by epa (subscriber, #39769)
[Link] (10 responses)
Posted Oct 19, 2022 20:15 UTC (Wed)
by mb (subscriber, #50428)
[Link] (9 responses)
What you payed: The game crashes or sporadically misbehaves or is slower than before.
In a single application scenario, which a game effectively is, the only task of the kernel is to make that application run as smooth as possible.
Posted Oct 19, 2022 22:14 UTC (Wed)
by mpr22 (subscriber, #60784)
[Link] (6 responses)
Unless you're streaming to Twitch, or your multiplayer game has no built-in chat and you're using a third-party application to communicate with your fellow players, or you hate the in-game music and are running a media player to get a soundtrack you actually like, or ...
Posted Oct 20, 2022 3:10 UTC (Thu)
by mb (subscriber, #50428)
[Link] (5 responses)
I would go as far to argue that throttling an application due to split locks on a single user system is always wrong.
Posted Oct 24, 2022 6:20 UTC (Mon)
by marcH (subscriber, #57642)
[Link] (3 responses)
Posted Oct 28, 2022 11:52 UTC (Fri)
by Vipketsh (guest, #134480)
[Link] (2 responses)
Is there any known exploit using this scenario to guard against ? I mean, users shouldn't go off and install random "break my machine" programs or if they do DoS-ing an individual's machine isn't exactly beneficial, nor is it the worst that an evil application can do.
I see this change and behaviour as more inline with the seemingly recent trend that the linux kernel is to do well out-of-the-box for cloud-based deployments, and only as a second concession allow individuals to tweak things so their single-user laptops and systems may work reasonably. A little sad and quite backwards since cloud operators have lots of talent on hand to tweak and analyse their systems (and they do anyway) with which individuals can't hope to compete.
Posted Oct 28, 2022 22:18 UTC (Fri)
by marcH (subscriber, #57642)
[Link] (1 responses)
Actually, by stalling abusive applications this improves the present of other applications too. Single app gaming really does not feel like a top Linux use case today. Unless you're counting ChromeOS, Android and Steam deck but then you're not administering your own system and you can count on its admins to optimize all this for you.
> Is there any known exploit using this scenario to guard against ?
This is not just about intentional abuse but also about performance under unintentional abuse too.
> recent trend that the linux kernel is to do well out-of-the-box for cloud-based deployments, and only as a second concession allow individuals
As already explained elsewhere this is not just about multi-user but about multi process in general.
Posted Oct 29, 2022 2:30 UTC (Sat)
by Vipketsh (guest, #134480)
[Link]
In theory I understand, but do you or anyone else have any numbers to the magnitude of this slowdown on, say, a typical 4/8 core laptop ? Theoretical problems should always be trumped by practical breakage, until proven otherwise.
This is like arguing that some application causing heavy contention on a kernel lock is a DoS attack or, if not that, the application is slowing down the system and thus the kernel should prevent it from running. Clearly this is madness. How are split locks any different ?
> also about performance under unintentional abuse too.
The malicious case is all that matters. For everything else, one of two possible outcomes is possible: (i) the performance issue is fixed and so is not a problem or (ii) the performance issue is not fixed in which case the choices are "slow(er) system" and "program does not work". A slower system is *always* preferred to a non working one and that is doubly true for machines of individuals.
Also let's not forget that this case is only relevant to x86 -- the risc machines (arm & riscv) not only don't support this feature but often don't support *any* unaligned access, atomic or otherwise. With their rise in popularity there will practically not be any cases of this in opensource and with propriety apps the question is that it works or not and working is always preferred.
Posted Oct 28, 2022 21:31 UTC (Fri)
by mrugiero (guest, #153040)
[Link]
You could, probably accurately, argue that this is always wrong if forced on the user. I.e., you could argue it should be opt-in for single user systems. But some of use would rather want to be able to report these kind of issues. Let alone being the developer of one such game and wanting a fair warning that you may be causing problems. Do you code in a multi-user system most of the time? I don't.
Posted Nov 8, 2022 8:39 UTC (Tue)
by roblucid (guest, #48964)
[Link] (1 responses)
Posted Nov 8, 2022 13:10 UTC (Tue)
by Wol (subscriber, #4433)
[Link]
Seeing as it appears to be pretty much only gaming systems that are affected, then it most definitely is a user space regression. Especially as a lot of these applications cannot be fixed by the users. And driving gamers to Windows/Apple will be seriously damaging to linux.
And lastly, isn't the (mis)feature itself actually a HARDWARE bug? "Mitigating" the bug by rendering the computer pretty much unusable for its intended purpose isn't a good idea!
Cheers,
Posted Oct 20, 2022 15:41 UTC (Thu)
by ericproberts (guest, #139553)
[Link]
Posted Oct 20, 2022 2:25 UTC (Thu)
by kschendel (subscriber, #20465)
[Link] (5 responses)
Bikeshedding, I guess, but still.
Posted Oct 20, 2022 13:00 UTC (Thu)
by tamara_schmitz (guest, #141258)
[Link]
0 Disables the misery mode - just warns the split lock on kernel log.
Posted Oct 20, 2022 15:53 UTC (Thu)
by WolfWings (subscriber, #56790)
[Link] (2 responses)
"0" disables the mitigation, allowing any single application to hog the bus for it's own locks and arbitrarily DDoS the rest of the system as a result.
Posted Oct 23, 2022 1:11 UTC (Sun)
by NYKevin (subscriber, #129325)
[Link] (1 responses)
More to the point, this whole idea is clownshoes anyway. The purpose of the kernel is to serve userspace, not to tell userspace what to do. If userspace wants to hurt its own performance, that's the sysadmin's* problem. For some configurations, it might make sense to allow the sysadmin to block or restrict split-lock operations, but it should function like an rlimit, not a system-wide "block first, ask questions later" flag.
* If there is no sysadmin, that means it's a single-user system and the "problem" is even more nonsensical.
Posted Oct 23, 2022 17:27 UTC (Sun)
by marcH (subscriber, #57642)
[Link]
No, the purpose of the kernel is to protect userspace from each other (some single application systems don't even have a kernel)
> If userspace wants to hurt its own performance, that's the sysadmin's* problem.
Default settings matter A LOT and it's really good to see overbusy maintainers spending so much time discussing and getting them right.
> > Affected gamers will have to set the new knob appropriately, but knowing which sysctls to tweak could be said to be part of being a true God of War.
Happy ending:
Very delicate trade-off perfectly found.
Posted Oct 21, 2022 4:08 UTC (Fri)
by ballombe (subscriber, #9523)
[Link]
Posted Oct 20, 2022 2:36 UTC (Thu)
by developer122 (guest, #152928)
[Link] (20 responses)
There is no attack being mitigated. The users of split-lock dependent software on single-user machines run those workloads fully accepting (nay, _expecting_*) the performance characteristics. It is tautologically impossible for this mechanism to provide them with any protection whatsoever from themselves.
The default is very plainly in the wrong place. The default should indeed prevent harm: by not disrupting existing workloads.
The place where the penalty is useful is in a multiuser system system. These multiuser systems are *exactly* the place to find a capable sysadmin who can fiddle a knob to ward off bad behavior, even as it arises. User complaints roll in, as do dmesg messages, and the problem is swiftly rectified.
I think this is simply a case where annoyance that "software is still not being fixed" is fueling an impulse to steam-roll past the reports of harm that the new default is causing. The unjustified expectation is that inflicting additional pain on the reporters will somehow convince an unrelated population to change their behavior.
* "Why shouldn't my game/database/whatever consume all available resources for maximum performance?"
Posted Oct 20, 2022 2:39 UTC (Thu)
by developer122 (guest, #152928)
[Link] (18 responses)
These users running various software may not be in a position to adjust the setting in question. There is a very good reason for the hard requirement that WINE and similar *MUST* work without elevated privileges available. This has come up before during the work on system call emulation.
Posted Oct 20, 2022 7:17 UTC (Thu)
by taladar (subscriber, #68407)
[Link] (17 responses)
Posted Oct 20, 2022 10:19 UTC (Thu)
by hkario (subscriber, #94864)
[Link] (16 responses)
Posted Oct 20, 2022 10:32 UTC (Thu)
by syrjala (subscriber, #47399)
[Link] (1 responses)
And I think most of the remaining cases are probably solved by: "Mom/Dad, can you toggle this sysctl knob for me?". Assuming the kid hasn't found some local root exploit already ;)
Posted Oct 20, 2022 20:32 UTC (Thu)
by developer122 (guest, #152928)
[Link]
Posted Oct 21, 2022 12:11 UTC (Fri)
by bartoc (guest, #124262)
[Link] (13 responses)
Posted Oct 21, 2022 12:19 UTC (Fri)
by mathstuf (subscriber, #69389)
[Link] (5 responses)
Incidentally, more programs supporting `/etc/prog.d/*.conf`-style configuration would be greatly appreciated :) .
> restoring misery mode when the game has exited.
ABAB problems sound fun with this. Also sounds like a maze full of fun error code paths that will never be reliably tested.
Posted Oct 21, 2022 12:29 UTC (Fri)
by bartoc (guest, #124262)
[Link] (4 responses)
I wonder if windows has compat shims for this kinda stuff.
Posted Oct 21, 2022 15:00 UTC (Fri)
by mathstuf (subscriber, #69389)
[Link] (2 responses)
TheOldNewThing blog by Raymond Chen also has lots of tales to this effect: https://devblogs.microsoft.com/oldnewthing/
Posted Oct 21, 2022 23:40 UTC (Fri)
by bartoc (guest, #124262)
[Link] (1 responses)
Posted Oct 22, 2022 23:26 UTC (Sat)
by developer122 (guest, #152928)
[Link]
Posted Oct 22, 2022 23:25 UTC (Sat)
by developer122 (guest, #152928)
[Link]
This same suggestion *also* came up during the kernel syscall emulation work. It was suggested that instead of having the kernel reroute attempts by a program to call a windows kernel syscall, wine could simply scan for and patch any such attempts.
This is not only hideously complicated and unreliable, it also doesn't work at all with exactly the class of programs we're interested with: Games.
They frequently include a wide variety of very gnarly anti-tampering features which cannot be automatically overcome. It is for this reason wine seeks to emulate the environment around the program, and never ever attempts to reach inside it.
Posted Oct 22, 2022 23:21 UTC (Sat)
by developer122 (guest, #152928)
[Link] (6 responses)
The entire steam linux runtime, and indeed every wine runtime MUST NOT require any more privileges than a regular user program. For installation or during runtime.
One philosophical reason: If it's emulating the windows ABI to run a program that doesn't requires privileges, then it must not as for any additional privileges of it's own.
Privileges during installation have never been required and are not allowed. Privileges that are repeatedly granted through permanently-lodged a setuid program that runs every time the game launches? Unthinkable.
Posted Oct 23, 2022 0:26 UTC (Sun)
by NYKevin (subscriber, #129325)
[Link] (1 responses)
That is a somewhat odd position to take, because on Windows:
1. Steam installs a service, which runs as "Local System." This is entirely equivalent to a daemon running as root, it's just that Windows uses different terminology.
Note: (3) is my understanding of how it works, but like a lot of gamers, I do something *even more terrible than the above* and install everything into C:\Games instead of Program Files, so I don't know for sure if (3) is the default behavior or just my own damn fault. Why do I do this, if I know it's terrible? Because life is too short, that's why. It is not uncommon for older games to randomly break if they don't have full write access to "everything," so deliberately subverting the OS's security is not uncommon for PC gamers. Even if Steam is doing everything right, that doesn't help when half the users are overriding the defaults and using a less-secure configuration.
Posted Oct 24, 2022 15:01 UTC (Mon)
by developer122 (guest, #152928)
[Link]
The point is that high permissions should *never* be required for installing and running a game, which does nothing but:
NONE of those things have ever warranted elevated privledges. Wine has continued doing it's thing for over a decade now without requiring sudo even once. The use of sudo wasn't needed when the ability to trap and redirect windows syscalls was added to the linux kernel, it sure as hell shouldn't be required because of a performance knob.
Posted Oct 24, 2022 13:35 UTC (Mon)
by implr (subscriber, #159818)
[Link] (3 responses)
Posted Oct 24, 2022 15:08 UTC (Mon)
by developer122 (guest, #152928)
[Link] (2 responses)
Does this privileged tunable make any sense on a singe user system? No it does not.
Posted Oct 24, 2022 21:01 UTC (Mon)
by Wol (subscriber, #4433)
[Link] (1 responses)
Cheers,
Posted Oct 25, 2022 10:22 UTC (Tue)
by geert (subscriber, #98403)
[Link]
https://www.gnu.org/software/groff/manual/html_node/Histo...
Posted Oct 28, 2022 21:35 UTC (Fri)
by mrugiero (guest, #153040)
[Link]
To be fair, split locks hurt their own performance as well. Maybe you do want your game to consume all available resources for maximum performance. Then take care of it actually providing maximum performance instead of harming it :)
Posted Oct 20, 2022 13:13 UTC (Thu)
by DouglasJM (subscriber, #6435)
[Link] (1 responses)
This is the type of writing that makes reading LWN so enjoyable, tongue in cheek comments that make me smile or laugh out loud. Keep up the great work folks, I look forward to reading LWN!
Posted Oct 20, 2022 14:12 UTC (Thu)
by JamesErik (subscriber, #17417)
[Link]
'''...split-lock operations have long been frowned upon. Unfortunately, software that is malicious (or just poorly written) turns out to be remarkably indifferent to even the most severe of frowns.'''
Thank you, Jonathan. I very much admire your editorial style, your professionalism, and your consistently human touch to your work... including humor that hits the funnybone of geeks everywhere!
Posted Oct 20, 2022 15:32 UTC (Thu)
by jhoblitt (subscriber, #77733)
[Link]
Posted Oct 20, 2022 17:37 UTC (Thu)
by excors (subscriber, #95769)
[Link]
Also you have a cool axe and kill a few gods and rip many thousands of monsters' heads off.
Posted Oct 21, 2022 10:04 UTC (Fri)
by scientes (guest, #83068)
[Link] (1 responses)
Ivan Goddard said that atomic operations rather than the cache-flushing approach is not really worth it, because it costs almost the same due to cache-coherency issues. I have no thought through that however (I can't even get my head around L2 cache-coherent Zync-9000 FPGA with AXI yet...)
Posted Oct 23, 2022 17:22 UTC (Sun)
by marcH (subscriber, #57642)
[Link]
Silicon bugs asides, this "basically" sounds weird in a discussion about split lock performance. The concept of a transaction is exactly what provides atomicity over a larger set of data _without_ any extra performance cost. Transactions make performance independent from the data size.
Posted Oct 25, 2022 6:27 UTC (Tue)
by Cyberax (✭ supporter ✭, #52523)
[Link] (3 responses)
Posted Oct 29, 2022 8:40 UTC (Sat)
by wtarreau (subscriber, #51152)
[Link] (2 responses)
Posted Oct 29, 2022 20:06 UTC (Sat)
by nybble41 (subscriber, #55106)
[Link] (1 responses)
Posted Oct 29, 2022 21:11 UTC (Sat)
by joib (subscriber, #8541)
[Link]
Posted Oct 28, 2022 22:20 UTC (Fri)
by marcH (subscriber, #57642)
[Link]
Wait, how does anyone know the warning had no effect? When we spot a warning and try to address it we don't tell anyone and AFAIK the kernel has no telemetry feature yet.
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
Games, as other programs, can crash if their atomic operation sematics get suddenly weakened.The search for the correct amount of split-lock misery
Just imagine how annoying random game crashes would be.
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
If there is a change to the kernel, which reduces game performance with no additional gain whatsoever, then it is a regression.
Clearly, there is no stalling problem of other applications, because it would have been noticed by the game developer before. This is mitigating a problem, that doesn't exist in this scenario.
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
It always reduces the user experience. It doesn't improve anything.
The only case where we gain something from throttling the app is on a multiuser system where one user is maliciously attacking the system as a whole. (This might be an unpriviledged remote user who might not even need a system account).
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
Gamers are concerned about core scaling, the application is sabotaging itself.
The search for the correct amount of split-lock misery
Wol
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
1 Enables the misery mode (this is the default) - penalizes the split lockers with intentional performance degradation.
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
- The "bug" will not go unnoticed and new applications will avoid it
- Old applications will run too after a few minutes searching the Internet.
The search for the correct amount of split-lock misery
The current one was made painful by design, not by necessity. This is a false dilemma.
The search for the correct amount of split-lock misery
Taken in context, I find this statement absurd.
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
>
> Privileges during installation have never been required and are not allowed. Privileges that are repeatedly granted through permanently-lodged a setuid program that runs every time the game launches? Unthinkable.
2. It is not uncommon for Steam games to display a UAC prompt on first run. This is usually to install MSVC++ redistributable or something of that nature, rather than doing some weird custom thing, but it still technically qualifies as elevated privileges.
3. The way that Steam manages to install games without requiring a UAC prompt for every installation is kind of... terrible. Basically, it sets the library as world-writable and world-executable. That means anyone can drop a DLL in the same directory as the game and silently hijack it, because Windows considers the directory permissions to constitute a security boundary (indeed, you could just as easily replace the whole exe file). Now, you may argue that this is irrelevant, since the game is running as an ordinary user rather than a superuser, but we have to consider the https://xkcd.com/1200/ factor.
The search for the correct amount of split-lock misery
We all know that user account permissions on windows are a total mess.
1) download some files
2) copy them into the home directory
3) launch an executable
4) access graphics APIs/sound APIs/input APIs
The search for the correct amount of split-lock misery
It already does, at least for VR. On first run SteamVR will ask for sudo, which it uses to setcap CAP_SYS_NICE on its various binaries. If it detects that it can already run at nice -10, it'll skip that step.
The search for the correct amount of split-lock misery
Worst case scenario, the user only DoSs themselves.
The search for the correct amount of split-lock misery
Wol
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
The search for the correct amount of split-lock misery
