Hi Joe,
One comment on the fallback: quota_usec = hz != -1 ? USEC_PER_SEC / hz : 1000; When HZ can't be determined (no CONFIG_IKCONFIG_PROC, or zcat missing), the fallback to 1000 is the exact value that fails at low HZ — so this doesn't actually fix such kernels. A larger fallback (e.g. 10000, the HZ=100 equivalent) would make the tests robust regardless of whether the config is exposed. 在 2026/6/23 03:43, Joe Simmons-Talbott 写道: > For lower HZ values a quota of 1000us is much lower than the amount > of microseconds per tick which makes the tests test_cpucg_max and > test_cpugc_max_nested fail. Use the amount of microseconds per tick > as the quota value. > > Signed-off-by: Joe Simmons-Talbott <[email protected]> > --- > changes since v1: > - Try checking /proc/config.gz to get the actual kernel HZ value and > fallback to 1000 if the value cannot be determined. > > tools/testing/selftests/cgroup/test_cpu.c | 33 +++++++++++++++++++++-- > 1 file changed, 31 insertions(+), 2 deletions(-) > > diff --git a/tools/testing/selftests/cgroup/test_cpu.c > b/tools/testing/selftests/cgroup/test_cpu.c > index 7a40d76b9548..65e09555309f 100644 > --- a/tools/testing/selftests/cgroup/test_cpu.c > +++ b/tools/testing/selftests/cgroup/test_cpu.c > @@ -639,6 +639,29 @@ test_cpucg_nested_weight_underprovisioned(const char > *root) > return run_cpucg_nested_weight_test(root, false); > } > > +/* > + * Best effort attempt to get the kernel's HZ value from the config. > + * Return the HZ value if found otherwise return -1 to indicate failure. > + */ > +static long > +_get_config_hz(void) > +{ > + long hz = -1; > + FILE *f; > + char cmd[256] = "zcat /proc/config.gz 2>/dev/null | grep '^CONFIG_HZ='"; > + > + f = popen(cmd, "r"); > + > + if (!f) > + goto out; > + > + fscanf(f, "CONFIG_HZ=%ld", &hz); > + > +out: > + pclose(f); > + return hz; > +} > + > /* > * This test creates a cgroup with some maximum value within a period, and > * verifies that a process in the cgroup is not overscheduled. > @@ -646,7 +669,8 @@ test_cpucg_nested_weight_underprovisioned(const char > *root) > static int test_cpucg_max(const char *root) > { > int ret = KSFT_FAIL; > - long quota_usec = 1000; > + long hz = _get_config_hz(); > + long quota_usec; > long default_period_usec = 100000; /* cpu.max's default period */ > long duration_seconds = 1; > > @@ -655,6 +679,8 @@ static int test_cpucg_max(const char *root) > char *cpucg; > char quota_buf[32]; > > + quota_usec = hz != -1 ? USEC_PER_SEC / hz : 1000; > + > snprintf(quota_buf, sizeof(quota_buf), "%ld", quota_usec); > > cpucg = cg_name(root, "cpucg_test"); > @@ -710,7 +736,8 @@ static int test_cpucg_max(const char *root) > static int test_cpucg_max_nested(const char *root) > { > int ret = KSFT_FAIL; > - long quota_usec = 1000; > + long quota_usec; > + long hz = _get_config_hz(); > long default_period_usec = 100000; /* cpu.max's default period */ > long duration_seconds = 1; > > @@ -719,6 +746,8 @@ static int test_cpucg_max_nested(const char *root) > char *parent, *child; > char quota_buf[32]; > > + quota_usec = hz != -1 ? USEC_PER_SEC / hz : 1000; > + > snprintf(quota_buf, sizeof(quota_buf), "%ld", quota_usec); > > parent = cg_name(root, "cpucg_parent");

