Re: [PATCH net 1/2] net: preserve rps_default_mask on failed writes
flat view
From: Wang Zhan <hidden>
Date: 2026-10-28 16:55:04
Also in:
linux-kselftest, lkml
On Wed, 28 Oct 2026 14:52:09 +0000 Yingjie Wang wrote:
rps_default_mask_sysctl() passes the live per-netns mask to
cpumask_parse(). bitmap_parse() stores chunks as it scans from right to
left, so a later error can leave lower chunks changed.
rps_cpumask_housekeeping() also intersects its input in place before
returning -EINVAL when no housekeeping CPUs remain.
Consequently, a failed write changes both the value read from the sysctl
and the default copied to RX queues created later. On a four-CPU VM,
after setting the mask to 1, writing zz,00000003 failed with EOVERFLOW
but changed the mask to 3. Writing a mask containing only isolated CPUs
failed with EINVAL but changed it to 0. No kernel modification or error
injection was needed to reproduce either case.
Parse and validate a temporary mask, then replace the live pointer only
after both steps succeed. Readers access and consume the pointer while
holding the same mutex, so the replaced mask can be freed after dropping
the mutex.
The rps_default_mask selftest failed on the base kernel and passed with
the fix. The fixed kernel also kept the mask at 1 for the overflow and
housekeeping failure cases, while valid writes of 2 and 0 still
succeeded.
The issue was found while fuzzing sysctl write error paths.
Fixes: 605cfa1b1090 ("net: introduce default_rps_mask netns attribute")
Signed-off-by: Yingjie Wang <redacted>Reviewed-by: Wang Zhan <redacted> Tested-by: Wang Zhan <redacted>