Peter Zijlstra <peterz@xxxxxxxxxxxxx> writes: > On Sun, May 02, 2021 at 01:39:16PM -0500, Eric W. Biederman wrote: > >> The one thing that this doesn't do is give you a 64bit field >> on 32bit architectures. >> >> On 32bit builds the layout is: >> >> int si_signo; >> int si_errno; >> int si_code; >> void __user *_addr; >> >> So I believe if the first 3 fields were moved into the _sifields union >> si_perf could define a 64bit field as it's first member and it would not >> break anything else. >> >> Given that the data field is 64bit that seems desirable. > > The data field is fundamentally an address, it is internally a u64 > because the perf ring buffer has u64 alignment and it saves on compat > crap etc. > > So for the 32bit/compat case the high bits will always be 0 and > truncating into an unsigned long is fine. I see why it is fine to truncate the data field into an unsigned long. Other than technical difficulties in extending siginfo_t is there any reason not to define data as a __u64? Eric