From: David Howells
Sent: Friday, August 18, 2023 12:43 PM
Linus Torvalds [off-list ref] wrote:
quoted
Well, that part is trivially fixable, and we should do that anyway for
other reasons.
..
enum iter_type {
/* iter types */
- ITER_IOVEC,
- ITER_KVEC,
- ITER_BVEC,
- ITER_XARRAY,
- ITER_DISCARD,
- ITER_UBUF,
+ ITER_IOVEC = 1,
+ ITER_UBUF = 2,
+ ITER_KVEC = 4,
+ ITER_BVEC = 8,
+ ITER_XARRAY = 16,
+ ITER_DISCARD = 32,
That could be zero - no bits and default.
quoted
};
It used to be this way, but Al switched it:
8cd54c1c848031a87820e58d772166ffdf8c08c0
iov_iter: separate direction from flavour
Except it also had the direction flag inside the enum.
That caused its own piles of grief.
IIRC Linus had type:6 - that doesn't leave any headroom
for additional types (even though they shouldn't proliferate).
It may be best to avoid bits 15+ (in a bitfield) due to
issues with large constants and sign extension.
On x86 (I think) 'and immediate' and 'bit test' are the same
size for bit 0 to 7, BIT wins for higher bits.
gcc generates strange code for some initialisers (see yesterday's
thread) and you definitely mustn't leave unused bits in a bitfield.
Might be better is the fields are assigned later!
(I also saw clang carefully preserving %eax on stabck!)
David
-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)