Messages in this thread | | | From | David Laight <> | Subject | RE: [PATCH bpf 1/1] bpf: btf: Fix bitfield extraction for big endian | Date | Tue, 10 Jul 2018 16:35:04 +0000 |
| |
From: Martin KaFai Lau > Sent: 09 July 2018 19:33 > On Sun, Jul 08, 2018 at 05:22:03PM -0700, Okash Khawaja wrote: > > When extracting bitfield from a number, btf_int_bits_seq_show() builds > > a mask and accesses least significant byte of the number in a way > > specific to little-endian. This patch fixes that by checking endianness > > of the machine and then shifting left and right the unneeded bits. > > > > Thanks to Martin Lau for the help in navigating potential pitfalls when > > dealing with endianess and for the final solution. > > > > Fixes: b00b8daec828 ("bpf: btf: Add pretty print capability for data with BTF type info") > > Signed-off-by: Okash Khawaja <osk@fb.com> > > > > --- > > kernel/bpf/btf.c | 32 +++++++++++++++----------------- > > 1 file changed, 15 insertions(+), 17 deletions(-) > > > > --- a/kernel/bpf/btf.c > > +++ b/kernel/bpf/btf.c > > @@ -162,6 +162,8 @@ > > #define BITS_ROUNDDOWN_BYTES(bits) ((bits) >> 3) > > #define BITS_ROUNDUP_BYTES(bits) \ > > (BITS_ROUNDDOWN_BYTES(bits) + !!BITS_PER_BYTE_MASKED(bits)) > > +const int one = 1; > > +#define is_big_endian() ((*(char *)&one) == 0) > > > > #define BTF_INFO_MASK 0x0f00ffff > > #define BTF_INT_MASK 0x0fffffff > > @@ -991,16 +993,13 @@ static void btf_int_bits_seq_show(const > > void *data, u8 bits_offset, > > struct seq_file *m) > > { > > + u8 left_shift_bits, right_shift_bits; > Nit. > Although only max 64 bit int is allowed now (ensured by btf_int_check_meta), > it is better to use u16 such that it will be consistent to BTF_INT_BITS.
Double-nit.
Use 'int' or 'unsigned int'. Sub-word arithmetic will require extra instructions on almost everything except x86.
David
| |