[PATCH v3] cpufreq: ondemand: Update the efficient idle check for Intel extended Families

Sohil Mehta posted 1 patch 1 month, 1 week ago
There is a newer version of this series
drivers/cpufreq/cpufreq_ondemand.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
[PATCH v3] cpufreq: ondemand: Update the efficient idle check for Intel extended Families
Posted by Sohil Mehta 1 month, 1 week ago
IO time is considered busy by default for modern Intel processors. The
current check covers recent Family 6 models but excludes the brand new
Families 18 and 19.

According to Arjan van de Ven, the model check was mainly due to a lack
of testing on systems before INTEL_CORE2_MEROM. He suggests considering
all Intel processors as having an efficient idle.

Extend the IO busy classification to all Intel processors starting with
Family 6, including Family 15 (Pentium 4s) and upcoming Families 18/19.

Signed-off-by: Sohil Mehta <sohil.mehta@intel.com>
---
v3:
 - Posting this patch separately since the core family cleanup series
   was merged without it.
 - Improve commit message and code comments.

v2: https://lore.kernel.org/lkml/20250211194407.2577252-7-sohil.mehta@intel.com/
---
 drivers/cpufreq/cpufreq_ondemand.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
index 0e65d37c9231..3decfc53fe68 100644
--- a/drivers/cpufreq/cpufreq_ondemand.c
+++ b/drivers/cpufreq/cpufreq_ondemand.c
@@ -15,6 +15,10 @@
 #include <linux/tick.h>
 #include <linux/sched/cpufreq.h>
 
+#ifdef CONFIG_X86
+#include <asm/cpu_device_id.h>
+#endif
+
 #include "cpufreq_ondemand.h"
 
 /* On-demand governor macros */
@@ -41,12 +45,9 @@ static unsigned int default_powersave_bias;
 static int should_io_be_busy(void)
 {
 #if defined(CONFIG_X86)
-	/*
-	 * For Intel, Core 2 (model 15) and later have an efficient idle.
-	 */
+	/* For Intel, Family 6 and later have an efficient idle. */
 	if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
-			boot_cpu_data.x86 == 6 &&
-			boot_cpu_data.x86_model >= 15)
+	    boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO)
 		return 1;
 #endif
 	return 0;
-- 
2.43.0
Re: [PATCH v3] cpufreq: ondemand: Update the efficient idle check for Intel extended Families
Posted by Rafael J. Wysocki 4 weeks ago
On Tue, Aug 26, 2025 at 8:38 PM Sohil Mehta <sohil.mehta@intel.com> wrote:
>
> IO time is considered busy by default for modern Intel processors. The
> current check covers recent Family 6 models but excludes the brand new
> Families 18 and 19.
>
> According to Arjan van de Ven, the model check was mainly due to a lack
> of testing on systems before INTEL_CORE2_MEROM. He suggests considering
> all Intel processors as having an efficient idle.
>
> Extend the IO busy classification to all Intel processors starting with
> Family 6, including Family 15 (Pentium 4s) and upcoming Families 18/19.
>
> Signed-off-by: Sohil Mehta <sohil.mehta@intel.com>
> ---
> v3:
>  - Posting this patch separately since the core family cleanup series
>    was merged without it.
>  - Improve commit message and code comments.
>
> v2: https://lore.kernel.org/lkml/20250211194407.2577252-7-sohil.mehta@intel.com/
> ---
>  drivers/cpufreq/cpufreq_ondemand.c | 11 ++++++-----
>  1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c
> index 0e65d37c9231..3decfc53fe68 100644
> --- a/drivers/cpufreq/cpufreq_ondemand.c
> +++ b/drivers/cpufreq/cpufreq_ondemand.c
> @@ -15,6 +15,10 @@
>  #include <linux/tick.h>
>  #include <linux/sched/cpufreq.h>

Since you are adding this #ifdef below, why don't you go a bit farther and do

> +#ifdef CONFIG_X86
> +#include <asm/cpu_device_id.h>

static bool should_io_be_busy(void)
{
       /* All Intel Family 6 and later processors have efficient idle. */
       return boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO;
}
#else
static inline bool should_io_be_busy(void)
{
        return false;
}
> +#endif
> +
>  #include "cpufreq_ondemand.h"
>
>  /* On-demand governor macros */
> @@ -41,12 +45,9 @@ static unsigned int default_powersave_bias;
>  static int should_io_be_busy(void)
>  {
>  #if defined(CONFIG_X86)
> -       /*
> -        * For Intel, Core 2 (model 15) and later have an efficient idle.
> -        */
> +       /* For Intel, Family 6 and later have an efficient idle. */
>         if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
> -                       boot_cpu_data.x86 == 6 &&
> -                       boot_cpu_data.x86_model >= 15)
> +           boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO)
>                 return 1;
>  #endif
>         return 0;
> --
Re: [PATCH v3] cpufreq: ondemand: Update the efficient idle check for Intel extended Families
Posted by Sohil Mehta 3 weeks, 6 days ago
On 9/4/2025 1:02 PM, Rafael J. Wysocki wrote:

> 
> Since you are adding this #ifdef below, why don't you go a bit farther and do
> 
>> +#ifdef CONFIG_X86
>> +#include <asm/cpu_device_id.h>
> 
> static bool should_io_be_busy(void)
> {
>        /* All Intel Family 6 and later processors have efficient idle. */
>        return boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
> boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO;
> }
> #else
> static inline bool should_io_be_busy(void)
> {
>         return false;
> }
>> +#endif
>> +
>>  #include "cpufreq_ondemand.h"
>>

I am fine with this approach. Would moving the #define to the header be
slightly better?

Add to cpufreq_ondemand.h:

#ifdef CONFIG_X86
#include <asm/cpu_device_id.h>
bool od_should_io_be_busy(void);
#else
static inline bool od_should_io_be_busy(void) { return false; }
#endif

Then, cpufreq_ondemand.c doesn't need the #ifdefs. It can simply do:

bool od_should_io_be_busy(void)
{
	/* For Intel, Family 6 and later have an efficient idle. */
	return (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
		boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO);
}
Re: [PATCH v3] cpufreq: ondemand: Update the efficient idle check for Intel extended Families
Posted by Rafael J. Wysocki 3 weeks, 3 days ago
On Fri, Sep 5, 2025 at 11:32 PM Sohil Mehta <sohil.mehta@intel.com> wrote:
>
> On 9/4/2025 1:02 PM, Rafael J. Wysocki wrote:
>
> >
> > Since you are adding this #ifdef below, why don't you go a bit farther and do
> >
> >> +#ifdef CONFIG_X86
> >> +#include <asm/cpu_device_id.h>
> >
> > static bool should_io_be_busy(void)
> > {
> >        /* All Intel Family 6 and later processors have efficient idle. */
> >        return boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
> > boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO;
> > }
> > #else
> > static inline bool should_io_be_busy(void)
> > {
> >         return false;
> > }
> >> +#endif
> >> +
> >>  #include "cpufreq_ondemand.h"
> >>
>
> I am fine with this approach. Would moving the #define to the header be
> slightly better?

I think so.

> Add to cpufreq_ondemand.h:
>
> #ifdef CONFIG_X86
> #include <asm/cpu_device_id.h>
> bool od_should_io_be_busy(void);
> #else
> static inline bool od_should_io_be_busy(void) { return false; }
> #endif
>
> Then, cpufreq_ondemand.c doesn't need the #ifdefs. It can simply do:
>
> bool od_should_io_be_busy(void)
> {
>         /* For Intel, Family 6 and later have an efficient idle. */
>         return (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
>                 boot_cpu_data.x86_vfm >= INTEL_PENTIUM_PRO);
> }

You'd still need to put the above under #ifdef CONFIG_X86 though.

But it may as well go into the header as static inline in the CONFIG_X86 case.
Re: [PATCH v3] cpufreq: ondemand: Update the efficient idle check for Intel extended Families
Posted by Sohil Mehta 3 weeks, 3 days ago
On 9/8/2025 11:54 AM, Rafael J. Wysocki wrote:

> But it may as well go into the header as static inline in the CONFIG_X86 case.

Makes sense. Will do.