[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