Re: [PATCH v4 0/3] tools/accounting: refactor delay fie lds and share format_timespec()
Thomas Weißschuh <[email protected]> Tue, 4 Aug 2026 09:36:16 +0200
| Newsgroups | gmane.linux.kernel,gmane.linux.documentation |
|---|---|
| Message-ID | <20260804093109-0cb2911d-72cc-41af-84dc-e0ca14e16f96@linutronix.de> |
On Tue, Aug 04, 2026 at 03:19:21PM +0800, [email protected] wrote: > >Thanks. Sashiko asks one question: > > https://sashiko.dev/#/patchset/[email protected] > > > >> +/* > >> + * Copied from include/uapi/linux/time_types.h > >> + * > >> + * Uses the arch-dependent __kernel_long_t rather than a hardcoded > >> + * 'long' so that x32 (ILP32 on x86_64), where the kernel defines > >> + * __kernel_long_t as 'long long', gets the correct struct layout. > >> + * > >> + * __kernel_long_t is provided by <asm/posix_types.h> - included > >> + * below via <linux/types.h> on most systems, or directly here. > >> + */ > >[ ... ] > >> +struct __kernel_old_timespec { > >> + __kernel_long_t tv_sec; > >> + long tv_nsec; > >Does this hardcoded long for tv_nsec cause an ABI layout mismatch on x32? > >The header comment above explicitly mentions avoiding a hardcoded long to > >ensure x32 gets the correct struct layout, but tv_nsec is defined as long > >here instead of __kernel_long_t. > >If tools compile against this header on x32, it looks like they will get a > >32-bit tv_nsec instead of the 64-bit value expected by the core kernel UAPI, > >which could result in truncated timestamps or out-of-bounds structure access. > > We cannot replace long with __kernel_long_t for tv_nsec. The UAPI *is* in fact about to use __kernel_long_t for tv_nsec. See commit 79ced850e549 ("y2038: uapi: Use 64-bit __kernel_old_timespec::tv_nsec on x32") in -next. > struct __kernel_old_timespec is a frozen UAPI type with a fixed layout. > On x32, the kernel uses long for tv_nsec, producing a 12-byte struct. > Changing the stub to __kernel_long_t would yield a 16-byte struct, > breaking sizeof() and struct embedding for any tool that includes > this header. tv_nsec only needs 32 bits (range 0..999,999,999), so > the kernel intentionally uses plain long here. The 'struct __kernel_old_timespec' as seen by x32 userspace comes from a x86_64 kernel. And for said kernel this is a 16-byte struct using an 8-byte tv_nsec. However this discussion is fairly moot, as x32 is about to be removed. (...) Thomas