Re: [PATCH v3] selftests: cpufreq: stop CPU hotplug loop after cpufreq update test
From: Rafael J. Wysocki (Intel)
Date: Tue Nov 10 2026 - 15:08:35 EST
On Fri, Oct 30, 2026 at 4:12 PM Zhongqiu Han
<zhongqiu.han@xxxxxxxxxxxxxxxx> wrote:
>
> On 10/30/2026 6:42 PM, xiong yining wrote:
> > Original test uses a fixed 5000 iteration loop to trigger CPU hotplug
> > for verifying cpufreq synchronization between CPU hotplug and sysfs
> > writes.
> >
> > Two issues exist:
> > 1. Background hotplug task keeps running after test completes, causing
> > redundant CPU on/offline operations.
> > 2. When cpufreq frequency setup is slow, the hotplug loop may exit
> > before frequency updates finish, which breaks test purpose.
> >
> > Use signal notification to terminate the infinite hotplug loop, and
> > add an EXIT trap to clean up the hotplug child when this test function
> > terminates abnormally.
> >
> > This makes hotplug run only during cpufreq sysfs write test,
> > align with test objective.
> >
> > Signed-off-by: xiong yining <xiongyining1480@xxxxxxxxxxxxxx>
>
> Reviewed-by: Zhongqiu Han <zhongqiu.han@xxxxxxxxxxxxxxxx>
Applied as 7.5 material, thanks!
> > ---
> > Changes in v3:
> > - Start the hotplug child after governor switch and sysfs frequency reads,
> > to avoid -EBUSY errors when the target CPU is offline.
> >
> > Changes in v2:
> > - Stop the hotplug child process by signal notification instead of
> > a stop file, avoiding the predictable temporary path.
> > - Add an exit trap so the hotplug child is also cleaned up when the
> > main shell terminates abnormally.
> > - Link to v1:
> > https://www.mail-archive.com/linux-kernel@xxxxxxxxxxxxxxx/msg2662696.html
> >
> > This addresses the security and robustness concerns raised by Sashiko.
> > ---
> > .../selftests/cpufreq/special-tests.sh | 30 +++++++++++++++----
> > 1 file changed, 24 insertions(+), 6 deletions(-)
> >
> > diff --git a/tools/testing/selftests/cpufreq/special-tests.sh b/tools/testing/selftests/cpufreq/special-tests.sh
> > index e87ed7c8e5e5..0665da8f2444 100755
> > --- a/tools/testing/selftests/cpufreq/special-tests.sh
> > +++ b/tools/testing/selftests/cpufreq/special-tests.sh
> > @@ -16,6 +16,8 @@ source cpu.sh
> > source cpufreq.sh
> > source governor.sh
> >
> > +HOTPLUG_PID=""
> > +
> > # Test 1
> > # $1: policy
> > __simple_lockdep()
> > @@ -92,6 +94,16 @@ governor_race()
> > restore_all_governors
> > }
> >
> > +hotplug_cleanup()
> > +{
> > + if [[ -n "$HOTPLUG_PID" ]]; then
> > + kill -s SIGTERM "$HOTPLUG_PID"
> > + wait "$HOTPLUG_PID"
> > +
> > + HOTPLUG_PID=""
> > + fi
> > +}
> > +
> > # Test 4
> > # $1: cpu
> > hotplug_with_updates_cpu()
> > @@ -101,14 +113,18 @@ hotplug_with_updates_cpu()
> > # switch to ondemand
> > __switch_governor_for_cpu $1 "ondemand"
> >
> > - for i in `seq 1 5000`
> > - do
> > - reboot_cpu $1
> > - done &
> > -
> > local freqs=$(cat $filepath/scaling_available_frequencies)
> > local oldfreq=$(cat $filepath/scaling_min_freq)
> >
> > + (
> > + local quit=0
> > + trap 'quit=1' SIGTERM
> > + while [ "$quit" -eq 0 ]; do
> > + reboot_cpu "$1"
> > + done
> > + ) &
> > + HOTPLUG_PID=$!
> > +
> > for j in `seq 1 5000`
> > do
> > # Set all frequencies one-by-one
> > @@ -117,14 +133,16 @@ hotplug_with_updates_cpu()
> > done
> > done
> >
> > + hotplug_cleanup
> > +
> > # restore old freq
> > echo $oldfreq > $filepath/scaling_min_freq
> > }
> >
> > hotplug_with_updates()
> > {
> > + trap 'hotplug_cleanup' EXIT
> > save_all_governors
> > for_each_non_boot_cpu hotplug_with_updates_cpu
> > - wait
> > restore_all_governors
> > }
>
>
> --
> Thx and BRs,
> Zhongqiu Han