[LTP] [PATCH v2] device-drivers/cpufreq_boost: Don't hardcode to CPU0

Wei Gao wegao@suse.com
Thu Jul 3 15:00:13 CEST 2025


On Mon, Jun 30, 2025 at 07:51:28AM -0700, Mike Tipton via ltp wrote:
> Some systems don't support boost on every CPU, such as on many Qualcomm
> chipsets. And if boost isn't supported on CPU0, then the test will fail
> since there's no performance improvement.
> 
> Instead of hardcoding CPU0, find the first CPU that belongs to a cpufreq
> policy with boost enabled.
> 
> Signed-off-by: Mike Tipton <mike.tipton@oss.qualcomm.com>
> ---
> Changes in v2:
> - Use proper maxspeed buf size in snprintf.
> - Link to v1: https://lore.kernel.org/ltp/20250626194707.3053036-1-mike.tipton@oss.qualcomm.com/
> 
>  .../device-drivers/cpufreq/cpufreq_boost.c    | 58 ++++++++++++++++---
>  1 file changed, 50 insertions(+), 8 deletions(-)
> 
> diff --git a/testcases/kernel/device-drivers/cpufreq/cpufreq_boost.c b/testcases/kernel/device-drivers/cpufreq/cpufreq_boost.c
> index 67917b3fea25..bbb5f602de4b 100644
> --- a/testcases/kernel/device-drivers/cpufreq/cpufreq_boost.c
> +++ b/testcases/kernel/device-drivers/cpufreq/cpufreq_boost.c
> @@ -55,10 +55,14 @@ static int id = -1;
>  
>  static int boost_value;
>  
> -const char governor[]	= SYSFS_CPU_DIR "cpu0/cpufreq/scaling_governor";
> +static int cpu;
> +
> +static const char _governor[] = SYSFS_CPU_DIR "cpu%d/cpufreq/scaling_governor";
> +static char governor[64];
>  static char governor_name[16];
>  
> -const char maxspeed[]	= SYSFS_CPU_DIR "cpu0/cpufreq/scaling_max_freq";
> +static const char _maxspeed[] = SYSFS_CPU_DIR "cpu%d/cpufreq/scaling_max_freq";
> +static char maxspeed[64];
>  
>  static void check_set_turbo(char *file, char *off)
>  {
> @@ -84,6 +88,40 @@ static void cleanup(void)
>  		FILE_PRINTF(governor, "%s", governor_name);
>  }
>  
> +static int find_boost_cpu(void)
> +{
> +	char buf[64];
> +	int fd, i;
> +
> +	/*
> +	 * The files we're looking for only exist for acpi_cpufreq. Continue
> +	 * assuming CPU0 for intel_pstate.
> +	 */
> +	if (!strcmp(cdrv[id].name, "intel_pstate"))
> +		return 0;
> +
> +	for (i = 0;; i++) {
> +		snprintf(buf, sizeof(buf), SYSFS_CPU_DIR "cpu%d", i);
> +		fd = open(buf, O_RDONLY);
> +		if (fd == -1)
> +			break;
> +
> +		close(fd);
> +
> +		snprintf(buf, sizeof(buf), SYSFS_CPU_DIR "cpu%d/cpufreq/boost", i);
> +		fd = open(buf, O_RDONLY);
> +		if (fd == -1)
> +			continue;
> +
> +		close(fd);
> +		tst_resm(TINFO, "found boost-capable CPU (CPU%d)", i);
> +		return i;
> +	}
> +
> +	tst_resm(TINFO, "didn't find boost-capable CPU (assuming CPU0)");
> +	return 0;

If not find any boost-capable CPU, i suppose we need give TCONF "not
support" message? Correct me if any misunderstanding. Thanks.

> +}
> +
>  static void setup(void)
>  {
>  	int fd;
> @@ -109,6 +147,10 @@ static void setup(void)
>  	tst_resm(TINFO, "found '%s' driver, sysfs knob '%s'",
>  		cdrv[id].name, cdrv[id].file);
>  
> +	cpu = find_boost_cpu();
> +	snprintf(governor, sizeof(governor), _governor, cpu);
> +	snprintf(maxspeed, sizeof(maxspeed), _maxspeed, cpu);
> +
>  	tst_sig(FORK, DEF_HANDLER, cleanup);
>  
>  	SAFE_FILE_SCANF(NULL, cdrv[i].file, "%d", &boost_value);
> @@ -120,16 +162,16 @@ static void setup(void)
>  	if (!strcmp(cdrv[i].name, "intel_pstate") && boost_value == cdrv[i].off)
>  		check_set_turbo(cdrv[i].file, cdrv[i].off_str);
>  
> -	/* change cpu0 scaling governor */
> +	/* change cpu scaling governor */
>  	SAFE_FILE_SCANF(NULL, governor, "%s", governor_name);
>  	SAFE_FILE_PRINTF(cleanup, governor, "%s", "performance");
>  
> -	/* use only cpu0 */
> +	/* use only a single cpu */
>  	cpu_set_t set;
>  	CPU_ZERO(&set);
> -	CPU_SET(0, &set);
> +	CPU_SET(cpu, &set);
>  	if (sched_setaffinity(0, sizeof(cpu_set_t), &set) < 0)
> -		tst_brkm(TBROK | TERRNO, cleanup, "failed to set CPU0");
> +		tst_brkm(TBROK | TERRNO, cleanup, "failed to set CPU%d", cpu);
>  
>  	struct sched_param params;
>  	params.sched_priority = sched_get_priority_max(SCHED_FIFO);
> @@ -176,12 +218,12 @@ static void test_run(void)
>  	/* Enable boost */
>  	if (boost_value == cdrv[id].off)
>  		SAFE_FILE_PRINTF(cleanup, cdrv[id].file, "%s", cdrv[id].on_str);
> -	tst_resm(TINFO, "load CPU0 with boost enabled");
> +	tst_resm(TINFO, "load CPU%d with boost enabled", cpu);
>  	boost_time = load_cpu(max_freq_khz);
>  
>  	/* Disable boost */
>  	SAFE_FILE_PRINTF(cleanup, cdrv[id].file, "%s", cdrv[id].off_str);
> -	tst_resm(TINFO, "load CPU0 with boost disabled");
> +	tst_resm(TINFO, "load CPU%d with boost disabled", cpu);
>  	boost_off_time = load_cpu(max_freq_khz);
>  
>  	boost_off_time *= .98;
> -- 
> 2.34.1
> 
> 
> -- 
> Mailing list info: https://lists.linux.it/listinfo/ltp


More information about the ltp mailing list