Re: [PATCH v4 0/3] tools/accounting: refactor delay fie lds and share format_timespec() 

Thomas Weißschuh <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.