RE: [PATCHv4 3/8] asm-generic: introduce be48 unaligned accessors

From: David Laight
Date: Thu Mar 03 2022 - 20:31:36 EST


From: Keith Busch
> Sent: 03 March 2022 20:13
>
> The NVMe protocol extended the data integrity fields with unaligned
> 48-bit reference tags.

If they are reference tags, are they only interpreted by the
sending system?
In which case they don't need to be big-endian since the
actual value doesn't really matter.

> Provide some helper accessors in preparation for these.
>
...
> diff --git a/include/asm-generic/unaligned.h b/include/asm-generic/unaligned.h
> index 1c4242416c9f..8fc637379899 100644
> --- a/include/asm-generic/unaligned.h
> +++ b/include/asm-generic/unaligned.h
> @@ -126,4 +126,30 @@ static inline void put_unaligned_le24(const u32 val, void *p)
> __put_unaligned_le24(val, p);
> }
>
> +static inline void __put_unaligned_be48(const u64 val, __u8 *p)
> +{
> + *p++ = val >> 40;
> + *p++ = val >> 32;
> + *p++ = val >> 24;
> + *p++ = val >> 16;
> + *p++ = val >> 8;
> + *p++ = val;
> +}

Although that matches __put_unaligned_be24() I think I'd use
array indexing not pointer increments.
The compiler will probably generate the same code anyway.

However it is probably better to do:
put_unaligned_be16(val >> 32, p);
put_unaligned_be32(val, p + 2);
so you get 2 memory accesses on x86 (etc) instead of 6.

Similarly for __get_unaligned_be48() where it is likely
so make a bigger difference.

David

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)