From: David Howells > Sent: Friday, August 18, 2023 12:43 PM > > Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > > 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. > > }; > > 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)