[LTP] [PATCH v11 1/2] lib: Extend tst_assert_ulong() with enum flags

Petr Vorel pvorel@suse.cz
Wed Sep 16 13:33:39 CEST 2026


> On Fri, Sep 04, 2026 at 08:51:06AM +0000, Andrea Cervesato wrote:
> > H Wei,

> > I was re-checking the whole patch-set and it looks a bit overengineered
> > from my point of view. A few points below.

> > > +enum tst_assert_flags {
> > > +	TST_ASSERT_SATURATED_INT = 1,
> > > +	TST_ASSERT_TRUNC_32BIT   = 2,
> > > +};

> > Adding new flags for the whole LTP core library trying to fix a single
> > test is not a good idea in general. Also, TST_ASSERT_TRUNC_32BIT is
> > probably not needed.

> But this is follow Cyril's suggestion:
> https://lore.kernel.org/ltp/aJm5SBOaRoe1e0PB@yuki.lan/

FYI the informal rule Cyril announced few weeks ago "at least two tests needs
it" (we talked about .max_kver member of struct tst_test, I guess this would
more or less applied to library API code.

When I acked this in v9 [1] (after suggesting to use enum instead of #define in
v8 [2]) I expected it'd be actually needed in more tests, based on Cyril's
suggestion.

Anyway, Dan Carpenter mentioned [3] kernel commit af7c693f1460
("Cap shmmax at INT_MAX in compat shminfo") which does 

+       if (smi->shmmax > INT_MAX)
+               smi->shmmax = INT_MAX;

[1] https://lore.kernel.org/ltp/20260902090418.GA910767@pevik/
[2] https://lore.kernel.org/ltp/20260828092602.GA715959@pevik/
[3] https://lore.kernel.org/ltp/aJYBSmcQpbHUvOqW@stanley.mountain/

Searching in kernel git

$ git grep -A2 'if.* > INT_MAX' |grep ' = INT_MAX' 

I found only:

block/bfq-iosched.c
drivers/usb/class/usbtmc.c
drivers/xen/pvcalls-front.c
fs/ext4/inode.c
include/net/netfilter/nf_conntrack_core.h
ipc/shm.c
kernel/time/itimer.c
lib/vsprintf.c
net/mptcp/protocol.c
sound/core/oss/pcm_oss.c
tools/lib/bpf/ringbuf.c

IMHO none of them uses export data truncated by INT_MAX to sysfs.

> > > +	safe_file_scanf(file, lineno, NULL, path, "%llu", &sys_val_64);

> > This is the real fix. Read below.

> > > +
> > > +	if (flags & TST_ASSERT_SATURATED_INT) {
> > > +		if (sys_val_64 > (unsigned long long)INT_MAX)
> > > +			expected_val = (unsigned long)INT_MAX;
> > > +		else
> > > +			expected_val = (unsigned long)sys_val_64;
> > > +	} else if (flags & TST_ASSERT_TRUNC_32BIT) {

> > In 32bit compat mode `unsigned long` becomes 32bit, so we can simply do:

> > void tst_assert_ulong(const char *file, const int lineno, const char *path, unsigned long val)
> > {
> > 	unsigned long long sys_val;

> > 	safe_file_scanf(file, lineno, NULL, path, "%llu", &sys_val);

> > 	if (val == (unsigned long)sys_val) {
> > 		tst_res_(file, lineno, TPASS, "%s = %lu", path, val);
> > 	}

> > 	tst_res_(file, lineno, TFAIL, "%s != %lu got %lu",
> > 		path, val, (unsigned long)sys_val);
> > }

> > And then, inside the test:

> > 	if (tst_is_compat_mode() && info.shmmax == INT_MAX)
> > 		tst_res(TPASS, "shmmax clamped to INT_MAX in compat mode");
> > 	else
> > 		TST_ASSERT_ULONG(PATH_KERN_SHMMAX, info.shmmax);

> > 	TST_ASSERT_ULONG(PATH_KERN_SHMMNI, info.shmmni);
> > 	TST_ASSERT_ULONG(PATH_KERN_SHMALL, info.shmall);

Looks like quite elegant solution, give we really need it just for a single
test.

> > Please verify if this is working anyway. We can probably fix the
> > whole patch-set with a couple of lines instead of defining
> > redundant flags and specific code for a single test.

Yes it works.

=> I vote to merge Andrea's solution instead.
@Cyril @Li WDYT?

Kind regards,
Petr

> > Regards,
> > --
> > Andrea Cervesato
> > SUSE QE Automation Engineer Linux
> > andrea.cervesato@suse.com


More information about the ltp mailing list