RE: [RFD] x86/split_lock: Request to Intel
From: David Laight
Date: Fri Oct 18 2019 - 06:45:21 EST
From: Luck, Tony
> Sent: 18 October 2019 00:28
...
> 2) Fix set_bit() et. al. to not issue atomic operations that cross boundaries.
>
> Fenghua had been pursuing option #1 in previous iterations. He found a few
> more places with the help of the "grep" patterns suggested by David Laight.
> So that path is up to ~8 patches now that do one of:
> + Change from u32 to u64
> + Force alignment with a union with a u64
> + Change to non-atomic (places that didn't need atomic)
>
> Downside of strategy #1 is that people will add new misaligned cases in the
> future. So this process has no defined end point.
>
> Strategy #2 begun when I looked at the split-lock issue I saw that with a
> constant bit argument set_bit() just does a "ORB" on the affected byte (i.e.
> no split lock). Similar for clear_bit() and change_bit(). Changing code to also
> do that for the variable bit case is easy.
>
> test_and_clr_bit() needs more care, but luckily, we had Peter Anvin nearby
> to give us a neat solution.
Changing the x86-64 bitops to use 32bit memory cycles is trivial
(provided you are willing to accept a limit of 2G bits).
OTOH this only works because x86 is LE.
On any BE systems passing an 'int []' to any of the bit-functions is so terribly
wrong it is unbelievable.
So changing the x86-64 bitops is largely papering over a crack.
In essence any code that casts the argument to any of the bitops functions
is almost certainly badly broken on BE systems.
The x86 cpu features code is always LE.
It probably ought to have a typedef for a union of long [] and int [].
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)