* [PATCH 0/2] cpuidle: Allow CPU idle states to be disabled by default @ 2019-11-21 18:35 Rafael J. Wysocki 2019-11-21 18:41 ` Rafael J. Wysocki 2019-11-21 18:44 ` [PATCH 2/2] cpuidle: Allow idle states to be disabled by default Rafael J. Wysocki 0 siblings, 2 replies; 8+ messages in thread From: Rafael J. Wysocki @ 2019-11-21 18:35 UTC (permalink / raw) To: Linux PM Cc: LKML, Srinivas Pandruvada, Len Brown, Daniel Lezcano, Len Brown, Rafael Wysocki Hi All, This is a follow-up to https://lore.kernel.org/linux-pm/1688511.GgkECGP1XA@kreacher/T/#u Patch [1/2] is a cleanup on top of the changes waiting for the 5.5 merge window in linux-next. Patch [2/2] is for the future, to be considered along with the first user of CPUIDLE_FLAG_OFF. Thanks, Rafael ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] cpuidle: Drop disabled field from struct cpuidle_state 2019-11-21 18:35 [PATCH 0/2] cpuidle: Allow CPU idle states to be disabled by default Rafael J. Wysocki @ 2019-11-21 18:41 ` Rafael J. Wysocki 2019-11-21 18:44 ` [PATCH 2/2] cpuidle: Allow idle states to be disabled by default Rafael J. Wysocki 1 sibling, 0 replies; 8+ messages in thread From: Rafael J. Wysocki @ 2019-11-21 18:41 UTC (permalink / raw) To: Linux PM Cc: LKML, Srinivas Pandruvada, Len Brown, Daniel Lezcano, Len Brown, Rafael Wysocki, Yoshinori Sato, Rich Felker, linux-sh From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> After recent cpuidle updates the "disabled" field in struct cpuidle_state is only used by two drivers (intel_idle and shmobile cpuidle) for marking unusable idle states, but that may as well be achieved with the help of a state flag, so define an "unusable" idle state flag, CPUIDLE_FLAG_UNUSABLE, make the drivers in question use it instead of the "disabled" field and make the core set CPUIDLE_STATE_DISABLED_BY_DRIVER for the idle states with that flag set. After the above changes, the "disabled" field in struct cpuidle_state is not used any more, so drop it. No intentional functional impact. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> --- Changes from RFC: - Do not add extra braces (unrelated to the rest of the patch). --- arch/sh/kernel/cpu/shmobile/cpuidle.c | 8 ++++---- drivers/cpuidle/cpuidle.c | 2 +- drivers/cpuidle/poll_state.c | 1 - drivers/idle/intel_idle.c | 6 +++--- include/linux/cpuidle.h | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) Index: linux-pm/drivers/idle/intel_idle.c =================================================================== --- linux-pm.orig/drivers/idle/intel_idle.c +++ linux-pm/drivers/idle/intel_idle.c @@ -1291,8 +1291,8 @@ static void sklh_idle_state_table_update return; } - skl_cstates[5].disabled = 1; /* C8-SKL */ - skl_cstates[6].disabled = 1; /* C9-SKL */ + skl_cstates[5].flags |= CPUIDLE_FLAG_UNUSABLE; /* C8-SKL */ + skl_cstates[6].flags |= CPUIDLE_FLAG_UNUSABLE; /* C9-SKL */ } /* * intel_idle_state_table_update() @@ -1355,7 +1355,7 @@ static void __init intel_idle_cpuidle_dr continue; /* if state marked as disabled, skip it */ - if (cpuidle_state_table[cstate].disabled != 0) { + if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { pr_debug("state %s is disabled\n", cpuidle_state_table[cstate].name); continue; Index: linux-pm/include/linux/cpuidle.h =================================================================== --- linux-pm.orig/include/linux/cpuidle.h +++ linux-pm/include/linux/cpuidle.h @@ -54,7 +54,6 @@ struct cpuidle_state { unsigned int exit_latency; /* in US */ int power_usage; /* in mW */ unsigned int target_residency; /* in US */ - bool disabled; /* disabled on all CPUs */ int (*enter) (struct cpuidle_device *dev, struct cpuidle_driver *drv, @@ -77,6 +76,7 @@ struct cpuidle_state { #define CPUIDLE_FLAG_POLLING BIT(0) /* polling state */ #define CPUIDLE_FLAG_COUPLED BIT(1) /* state applies to multiple cpus */ #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */ +#define CPUIDLE_FLAG_UNUSABLE BIT(3) /* avoid using this state */ struct cpuidle_device_kobj; struct cpuidle_state_kobj; Index: linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c =================================================================== --- linux-pm.orig/arch/sh/kernel/cpu/shmobile/cpuidle.c +++ linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c @@ -67,7 +67,7 @@ static struct cpuidle_driver cpuidle_dri .enter = cpuidle_sleep_enter, .name = "C2", .desc = "SuperH Sleep Mode [SF]", - .disabled = true, + .flags = CPUIDLE_FLAG_UNUSABLE, }, { .exit_latency = 2300, @@ -76,7 +76,7 @@ static struct cpuidle_driver cpuidle_dri .enter = cpuidle_sleep_enter, .name = "C3", .desc = "SuperH Mobile Standby Mode [SF]", - .disabled = true, + .flags = CPUIDLE_FLAG_UNUSABLE, }, }, .safe_state_index = 0, @@ -86,10 +86,10 @@ static struct cpuidle_driver cpuidle_dri int __init sh_mobile_setup_cpuidle(void) { if (sh_mobile_sleep_supported & SUSP_SH_SF) - cpuidle_driver.states[1].disabled = false; + cpuidle_driver.states[1].flags = CPUIDLE_FLAG_NONE; if (sh_mobile_sleep_supported & SUSP_SH_STANDBY) - cpuidle_driver.states[2].disabled = false; + cpuidle_driver.states[2].flags = CPUIDLE_FLAG_NONE; return cpuidle_register(&cpuidle_driver, NULL); } Index: linux-pm/drivers/cpuidle/cpuidle.c =================================================================== --- linux-pm.orig/drivers/cpuidle/cpuidle.c +++ linux-pm/drivers/cpuidle/cpuidle.c @@ -570,7 +570,7 @@ static int __cpuidle_register_device(str return -EINVAL; for (i = 0; i < drv->state_count; i++) - if (drv->states[i].disabled) + if (drv->states[i].flags & CPUIDLE_FLAG_UNUSABLE) dev->states_usage[i].disable |= CPUIDLE_STATE_DISABLED_BY_DRIVER; per_cpu(cpuidle_devices, dev->cpu) = dev; Index: linux-pm/drivers/cpuidle/poll_state.c =================================================================== --- linux-pm.orig/drivers/cpuidle/poll_state.c +++ linux-pm/drivers/cpuidle/poll_state.c @@ -53,7 +53,6 @@ void cpuidle_poll_state_init(struct cpui state->target_residency_ns = 0; state->power_usage = -1; state->enter = poll_idle; - state->disabled = false; state->flags = CPUIDLE_FLAG_POLLING; } EXPORT_SYMBOL_GPL(cpuidle_poll_state_init); ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/2] cpuidle: Drop disabled field from struct cpuidle_state @ 2019-11-21 18:41 ` Rafael J. Wysocki 0 siblings, 0 replies; 8+ messages in thread From: Rafael J. Wysocki @ 2019-11-21 18:41 UTC (permalink / raw) To: Linux PM Cc: LKML, Srinivas Pandruvada, Len Brown, Daniel Lezcano, Len Brown, Rafael Wysocki, Yoshinori Sato, Rich Felker, linux-sh From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> After recent cpuidle updates the "disabled" field in struct cpuidle_state is only used by two drivers (intel_idle and shmobile cpuidle) for marking unusable idle states, but that may as well be achieved with the help of a state flag, so define an "unusable" idle state flag, CPUIDLE_FLAG_UNUSABLE, make the drivers in question use it instead of the "disabled" field and make the core set CPUIDLE_STATE_DISABLED_BY_DRIVER for the idle states with that flag set. After the above changes, the "disabled" field in struct cpuidle_state is not used any more, so drop it. No intentional functional impact. Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> --- Changes from RFC: - Do not add extra braces (unrelated to the rest of the patch). --- arch/sh/kernel/cpu/shmobile/cpuidle.c | 8 ++++---- drivers/cpuidle/cpuidle.c | 2 +- drivers/cpuidle/poll_state.c | 1 - drivers/idle/intel_idle.c | 6 +++--- include/linux/cpuidle.h | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) Index: linux-pm/drivers/idle/intel_idle.c =================================--- linux-pm.orig/drivers/idle/intel_idle.c +++ linux-pm/drivers/idle/intel_idle.c @@ -1291,8 +1291,8 @@ static void sklh_idle_state_table_update return; } - skl_cstates[5].disabled = 1; /* C8-SKL */ - skl_cstates[6].disabled = 1; /* C9-SKL */ + skl_cstates[5].flags |= CPUIDLE_FLAG_UNUSABLE; /* C8-SKL */ + skl_cstates[6].flags |= CPUIDLE_FLAG_UNUSABLE; /* C9-SKL */ } /* * intel_idle_state_table_update() @@ -1355,7 +1355,7 @@ static void __init intel_idle_cpuidle_dr continue; /* if state marked as disabled, skip it */ - if (cpuidle_state_table[cstate].disabled != 0) { + if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { pr_debug("state %s is disabled\n", cpuidle_state_table[cstate].name); continue; Index: linux-pm/include/linux/cpuidle.h =================================--- linux-pm.orig/include/linux/cpuidle.h +++ linux-pm/include/linux/cpuidle.h @@ -54,7 +54,6 @@ struct cpuidle_state { unsigned int exit_latency; /* in US */ int power_usage; /* in mW */ unsigned int target_residency; /* in US */ - bool disabled; /* disabled on all CPUs */ int (*enter) (struct cpuidle_device *dev, struct cpuidle_driver *drv, @@ -77,6 +76,7 @@ struct cpuidle_state { #define CPUIDLE_FLAG_POLLING BIT(0) /* polling state */ #define CPUIDLE_FLAG_COUPLED BIT(1) /* state applies to multiple cpus */ #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */ +#define CPUIDLE_FLAG_UNUSABLE BIT(3) /* avoid using this state */ struct cpuidle_device_kobj; struct cpuidle_state_kobj; Index: linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c =================================--- linux-pm.orig/arch/sh/kernel/cpu/shmobile/cpuidle.c +++ linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c @@ -67,7 +67,7 @@ static struct cpuidle_driver cpuidle_dri .enter = cpuidle_sleep_enter, .name = "C2", .desc = "SuperH Sleep Mode [SF]", - .disabled = true, + .flags = CPUIDLE_FLAG_UNUSABLE, }, { .exit_latency = 2300, @@ -76,7 +76,7 @@ static struct cpuidle_driver cpuidle_dri .enter = cpuidle_sleep_enter, .name = "C3", .desc = "SuperH Mobile Standby Mode [SF]", - .disabled = true, + .flags = CPUIDLE_FLAG_UNUSABLE, }, }, .safe_state_index = 0, @@ -86,10 +86,10 @@ static struct cpuidle_driver cpuidle_dri int __init sh_mobile_setup_cpuidle(void) { if (sh_mobile_sleep_supported & SUSP_SH_SF) - cpuidle_driver.states[1].disabled = false; + cpuidle_driver.states[1].flags = CPUIDLE_FLAG_NONE; if (sh_mobile_sleep_supported & SUSP_SH_STANDBY) - cpuidle_driver.states[2].disabled = false; + cpuidle_driver.states[2].flags = CPUIDLE_FLAG_NONE; return cpuidle_register(&cpuidle_driver, NULL); } Index: linux-pm/drivers/cpuidle/cpuidle.c =================================--- linux-pm.orig/drivers/cpuidle/cpuidle.c +++ linux-pm/drivers/cpuidle/cpuidle.c @@ -570,7 +570,7 @@ static int __cpuidle_register_device(str return -EINVAL; for (i = 0; i < drv->state_count; i++) - if (drv->states[i].disabled) + if (drv->states[i].flags & CPUIDLE_FLAG_UNUSABLE) dev->states_usage[i].disable |= CPUIDLE_STATE_DISABLED_BY_DRIVER; per_cpu(cpuidle_devices, dev->cpu) = dev; Index: linux-pm/drivers/cpuidle/poll_state.c =================================--- linux-pm.orig/drivers/cpuidle/poll_state.c +++ linux-pm/drivers/cpuidle/poll_state.c @@ -53,7 +53,6 @@ void cpuidle_poll_state_init(struct cpui state->target_residency_ns = 0; state->power_usage = -1; state->enter = poll_idle; - state->disabled = false; state->flags = CPUIDLE_FLAG_POLLING; } EXPORT_SYMBOL_GPL(cpuidle_poll_state_init); ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] cpuidle: Drop disabled field from struct cpuidle_state 2019-11-21 18:41 ` Rafael J. Wysocki @ 2019-12-05 11:15 ` Daniel Lezcano -1 siblings, 0 replies; 8+ messages in thread From: Daniel Lezcano @ 2019-12-05 11:15 UTC (permalink / raw) To: Rafael J. Wysocki, Linux PM Cc: LKML, Srinivas Pandruvada, Len Brown, Len Brown, Rafael Wysocki, Yoshinori Sato, Rich Felker, linux-sh On 21/11/2019 19:41, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > After recent cpuidle updates the "disabled" field in struct > cpuidle_state is only used by two drivers (intel_idle and shmobile > cpuidle) for marking unusable idle states, but that may as well be > achieved with the help of a state flag, so define an "unusable" idle > state flag, CPUIDLE_FLAG_UNUSABLE, make the drivers in question use > it instead of the "disabled" field and make the core set > CPUIDLE_STATE_DISABLED_BY_DRIVER for the idle states with that flag > set. > > After the above changes, the "disabled" field in struct cpuidle_state > is not used any more, so drop it. > > No intentional functional impact. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > > Changes from RFC: > > - Do not add extra braces (unrelated to the rest of the patch). > > --- > arch/sh/kernel/cpu/shmobile/cpuidle.c | 8 ++++---- > drivers/cpuidle/cpuidle.c | 2 +- > drivers/cpuidle/poll_state.c | 1 - > drivers/idle/intel_idle.c | 6 +++--- > include/linux/cpuidle.h | 2 +- > 5 files changed, 9 insertions(+), 10 deletions(-) > > Index: linux-pm/drivers/idle/intel_idle.c > =================================================================== > --- linux-pm.orig/drivers/idle/intel_idle.c > +++ linux-pm/drivers/idle/intel_idle.c > @@ -1291,8 +1291,8 @@ static void sklh_idle_state_table_update > return; > } > > - skl_cstates[5].disabled = 1; /* C8-SKL */ > - skl_cstates[6].disabled = 1; /* C9-SKL */ > + skl_cstates[5].flags |= CPUIDLE_FLAG_UNUSABLE; /* C8-SKL */ > + skl_cstates[6].flags |= CPUIDLE_FLAG_UNUSABLE; /* C9-SKL */ > } > /* > * intel_idle_state_table_update() > @@ -1355,7 +1355,7 @@ static void __init intel_idle_cpuidle_dr > continue; > > /* if state marked as disabled, skip it */ > - if (cpuidle_state_table[cstate].disabled != 0) { > + if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { > pr_debug("state %s is disabled\n", > cpuidle_state_table[cstate].name); > continue; > Index: linux-pm/include/linux/cpuidle.h > =================================================================== > --- linux-pm.orig/include/linux/cpuidle.h > +++ linux-pm/include/linux/cpuidle.h > @@ -54,7 +54,6 @@ struct cpuidle_state { > unsigned int exit_latency; /* in US */ > int power_usage; /* in mW */ > unsigned int target_residency; /* in US */ > - bool disabled; /* disabled on all CPUs */ > > int (*enter) (struct cpuidle_device *dev, > struct cpuidle_driver *drv, > @@ -77,6 +76,7 @@ struct cpuidle_state { > #define CPUIDLE_FLAG_POLLING BIT(0) /* polling state */ > #define CPUIDLE_FLAG_COUPLED BIT(1) /* state applies to multiple cpus */ > #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */ > +#define CPUIDLE_FLAG_UNUSABLE BIT(3) /* avoid using this state */ > > struct cpuidle_device_kobj; > struct cpuidle_state_kobj; > Index: linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > =================================================================== > --- linux-pm.orig/arch/sh/kernel/cpu/shmobile/cpuidle.c > +++ linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > @@ -67,7 +67,7 @@ static struct cpuidle_driver cpuidle_dri > .enter = cpuidle_sleep_enter, > .name = "C2", > .desc = "SuperH Sleep Mode [SF]", > - .disabled = true, > + .flags = CPUIDLE_FLAG_UNUSABLE, > }, > { > .exit_latency = 2300, > @@ -76,7 +76,7 @@ static struct cpuidle_driver cpuidle_dri > .enter = cpuidle_sleep_enter, > .name = "C3", > .desc = "SuperH Mobile Standby Mode [SF]", > - .disabled = true, > + .flags = CPUIDLE_FLAG_UNUSABLE, > }, > }, > .safe_state_index = 0, > @@ -86,10 +86,10 @@ static struct cpuidle_driver cpuidle_dri > int __init sh_mobile_setup_cpuidle(void) > { > if (sh_mobile_sleep_supported & SUSP_SH_SF) > - cpuidle_driver.states[1].disabled = false; > + cpuidle_driver.states[1].flags = CPUIDLE_FLAG_NONE; That will overwrite other flags value, bit operation should be used here to remove CPUIDLE_FLAG_UNUSABLE. > if (sh_mobile_sleep_supported & SUSP_SH_STANDBY) > - cpuidle_driver.states[2].disabled = false; > + cpuidle_driver.states[2].flags = CPUIDLE_FLAG_NONE; > > return cpuidle_register(&cpuidle_driver, NULL); > } > Index: linux-pm/drivers/cpuidle/cpuidle.c > =================================================================== > --- linux-pm.orig/drivers/cpuidle/cpuidle.c > +++ linux-pm/drivers/cpuidle/cpuidle.c > @@ -570,7 +570,7 @@ static int __cpuidle_register_device(str > return -EINVAL; > > for (i = 0; i < drv->state_count; i++) > - if (drv->states[i].disabled) > + if (drv->states[i].flags & CPUIDLE_FLAG_UNUSABLE) > dev->states_usage[i].disable |= CPUIDLE_STATE_DISABLED_BY_DRIVER; > > per_cpu(cpuidle_devices, dev->cpu) = dev; > Index: linux-pm/drivers/cpuidle/poll_state.c > =================================================================== > --- linux-pm.orig/drivers/cpuidle/poll_state.c > +++ linux-pm/drivers/cpuidle/poll_state.c > @@ -53,7 +53,6 @@ void cpuidle_poll_state_init(struct cpui > state->target_residency_ns = 0; > state->power_usage = -1; > state->enter = poll_idle; > - state->disabled = false; > state->flags = CPUIDLE_FLAG_POLLING; > } > EXPORT_SYMBOL_GPL(cpuidle_poll_state_init); > > > -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] cpuidle: Drop disabled field from struct cpuidle_state @ 2019-12-05 11:15 ` Daniel Lezcano 0 siblings, 0 replies; 8+ messages in thread From: Daniel Lezcano @ 2019-12-05 11:15 UTC (permalink / raw) To: Rafael J. Wysocki, Linux PM Cc: LKML, Srinivas Pandruvada, Len Brown, Len Brown, Rafael Wysocki, Yoshinori Sato, Rich Felker, linux-sh On 21/11/2019 19:41, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > After recent cpuidle updates the "disabled" field in struct > cpuidle_state is only used by two drivers (intel_idle and shmobile > cpuidle) for marking unusable idle states, but that may as well be > achieved with the help of a state flag, so define an "unusable" idle > state flag, CPUIDLE_FLAG_UNUSABLE, make the drivers in question use > it instead of the "disabled" field and make the core set > CPUIDLE_STATE_DISABLED_BY_DRIVER for the idle states with that flag > set. > > After the above changes, the "disabled" field in struct cpuidle_state > is not used any more, so drop it. > > No intentional functional impact. > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > --- > > Changes from RFC: > > - Do not add extra braces (unrelated to the rest of the patch). > > --- > arch/sh/kernel/cpu/shmobile/cpuidle.c | 8 ++++---- > drivers/cpuidle/cpuidle.c | 2 +- > drivers/cpuidle/poll_state.c | 1 - > drivers/idle/intel_idle.c | 6 +++--- > include/linux/cpuidle.h | 2 +- > 5 files changed, 9 insertions(+), 10 deletions(-) > > Index: linux-pm/drivers/idle/intel_idle.c > =================================> --- linux-pm.orig/drivers/idle/intel_idle.c > +++ linux-pm/drivers/idle/intel_idle.c > @@ -1291,8 +1291,8 @@ static void sklh_idle_state_table_update > return; > } > > - skl_cstates[5].disabled = 1; /* C8-SKL */ > - skl_cstates[6].disabled = 1; /* C9-SKL */ > + skl_cstates[5].flags |= CPUIDLE_FLAG_UNUSABLE; /* C8-SKL */ > + skl_cstates[6].flags |= CPUIDLE_FLAG_UNUSABLE; /* C9-SKL */ > } > /* > * intel_idle_state_table_update() > @@ -1355,7 +1355,7 @@ static void __init intel_idle_cpuidle_dr > continue; > > /* if state marked as disabled, skip it */ > - if (cpuidle_state_table[cstate].disabled != 0) { > + if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { > pr_debug("state %s is disabled\n", > cpuidle_state_table[cstate].name); > continue; > Index: linux-pm/include/linux/cpuidle.h > =================================> --- linux-pm.orig/include/linux/cpuidle.h > +++ linux-pm/include/linux/cpuidle.h > @@ -54,7 +54,6 @@ struct cpuidle_state { > unsigned int exit_latency; /* in US */ > int power_usage; /* in mW */ > unsigned int target_residency; /* in US */ > - bool disabled; /* disabled on all CPUs */ > > int (*enter) (struct cpuidle_device *dev, > struct cpuidle_driver *drv, > @@ -77,6 +76,7 @@ struct cpuidle_state { > #define CPUIDLE_FLAG_POLLING BIT(0) /* polling state */ > #define CPUIDLE_FLAG_COUPLED BIT(1) /* state applies to multiple cpus */ > #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */ > +#define CPUIDLE_FLAG_UNUSABLE BIT(3) /* avoid using this state */ > > struct cpuidle_device_kobj; > struct cpuidle_state_kobj; > Index: linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > =================================> --- linux-pm.orig/arch/sh/kernel/cpu/shmobile/cpuidle.c > +++ linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > @@ -67,7 +67,7 @@ static struct cpuidle_driver cpuidle_dri > .enter = cpuidle_sleep_enter, > .name = "C2", > .desc = "SuperH Sleep Mode [SF]", > - .disabled = true, > + .flags = CPUIDLE_FLAG_UNUSABLE, > }, > { > .exit_latency = 2300, > @@ -76,7 +76,7 @@ static struct cpuidle_driver cpuidle_dri > .enter = cpuidle_sleep_enter, > .name = "C3", > .desc = "SuperH Mobile Standby Mode [SF]", > - .disabled = true, > + .flags = CPUIDLE_FLAG_UNUSABLE, > }, > }, > .safe_state_index = 0, > @@ -86,10 +86,10 @@ static struct cpuidle_driver cpuidle_dri > int __init sh_mobile_setup_cpuidle(void) > { > if (sh_mobile_sleep_supported & SUSP_SH_SF) > - cpuidle_driver.states[1].disabled = false; > + cpuidle_driver.states[1].flags = CPUIDLE_FLAG_NONE; That will overwrite other flags value, bit operation should be used here to remove CPUIDLE_FLAG_UNUSABLE. > if (sh_mobile_sleep_supported & SUSP_SH_STANDBY) > - cpuidle_driver.states[2].disabled = false; > + cpuidle_driver.states[2].flags = CPUIDLE_FLAG_NONE; > > return cpuidle_register(&cpuidle_driver, NULL); > } > Index: linux-pm/drivers/cpuidle/cpuidle.c > =================================> --- linux-pm.orig/drivers/cpuidle/cpuidle.c > +++ linux-pm/drivers/cpuidle/cpuidle.c > @@ -570,7 +570,7 @@ static int __cpuidle_register_device(str > return -EINVAL; > > for (i = 0; i < drv->state_count; i++) > - if (drv->states[i].disabled) > + if (drv->states[i].flags & CPUIDLE_FLAG_UNUSABLE) > dev->states_usage[i].disable |= CPUIDLE_STATE_DISABLED_BY_DRIVER; > > per_cpu(cpuidle_devices, dev->cpu) = dev; > Index: linux-pm/drivers/cpuidle/poll_state.c > =================================> --- linux-pm.orig/drivers/cpuidle/poll_state.c > +++ linux-pm/drivers/cpuidle/poll_state.c > @@ -53,7 +53,6 @@ void cpuidle_poll_state_init(struct cpui > state->target_residency_ns = 0; > state->power_usage = -1; > state->enter = poll_idle; > - state->disabled = false; > state->flags = CPUIDLE_FLAG_POLLING; > } > EXPORT_SYMBOL_GPL(cpuidle_poll_state_init); > > > -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] cpuidle: Drop disabled field from struct cpuidle_state 2019-12-05 11:15 ` Daniel Lezcano @ 2019-12-05 12:02 ` Rafael J. Wysocki -1 siblings, 0 replies; 8+ messages in thread From: Rafael J. Wysocki @ 2019-12-05 12:02 UTC (permalink / raw) To: Daniel Lezcano Cc: Rafael J. Wysocki, Linux PM, LKML, Srinivas Pandruvada, Len Brown, Len Brown, Rafael Wysocki, Yoshinori Sato, Rich Felker, Linux-sh list On Thu, Dec 5, 2019 at 12:15 PM Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > > On 21/11/2019 19:41, Rafael J. Wysocki wrote: > > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > > > After recent cpuidle updates the "disabled" field in struct > > cpuidle_state is only used by two drivers (intel_idle and shmobile > > cpuidle) for marking unusable idle states, but that may as well be > > achieved with the help of a state flag, so define an "unusable" idle > > state flag, CPUIDLE_FLAG_UNUSABLE, make the drivers in question use > > it instead of the "disabled" field and make the core set > > CPUIDLE_STATE_DISABLED_BY_DRIVER for the idle states with that flag > > set. > > > > After the above changes, the "disabled" field in struct cpuidle_state > > is not used any more, so drop it. > > > > No intentional functional impact. > > > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > --- > > > > Changes from RFC: > > > > - Do not add extra braces (unrelated to the rest of the patch). > > > > --- > > arch/sh/kernel/cpu/shmobile/cpuidle.c | 8 ++++---- > > drivers/cpuidle/cpuidle.c | 2 +- > > drivers/cpuidle/poll_state.c | 1 - > > drivers/idle/intel_idle.c | 6 +++--- > > include/linux/cpuidle.h | 2 +- > > 5 files changed, 9 insertions(+), 10 deletions(-) > > > > Index: linux-pm/drivers/idle/intel_idle.c > > =================================================================== > > --- linux-pm.orig/drivers/idle/intel_idle.c > > +++ linux-pm/drivers/idle/intel_idle.c > > @@ -1291,8 +1291,8 @@ static void sklh_idle_state_table_update > > return; > > } > > > > - skl_cstates[5].disabled = 1; /* C8-SKL */ > > - skl_cstates[6].disabled = 1; /* C9-SKL */ > > + skl_cstates[5].flags |= CPUIDLE_FLAG_UNUSABLE; /* C8-SKL */ > > + skl_cstates[6].flags |= CPUIDLE_FLAG_UNUSABLE; /* C9-SKL */ > > } > > /* > > * intel_idle_state_table_update() > > @@ -1355,7 +1355,7 @@ static void __init intel_idle_cpuidle_dr > > continue; > > > > /* if state marked as disabled, skip it */ > > - if (cpuidle_state_table[cstate].disabled != 0) { > > + if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { > > pr_debug("state %s is disabled\n", > > cpuidle_state_table[cstate].name); > > continue; > > Index: linux-pm/include/linux/cpuidle.h > > =================================================================== > > --- linux-pm.orig/include/linux/cpuidle.h > > +++ linux-pm/include/linux/cpuidle.h > > @@ -54,7 +54,6 @@ struct cpuidle_state { > > unsigned int exit_latency; /* in US */ > > int power_usage; /* in mW */ > > unsigned int target_residency; /* in US */ > > - bool disabled; /* disabled on all CPUs */ > > > > int (*enter) (struct cpuidle_device *dev, > > struct cpuidle_driver *drv, > > @@ -77,6 +76,7 @@ struct cpuidle_state { > > #define CPUIDLE_FLAG_POLLING BIT(0) /* polling state */ > > #define CPUIDLE_FLAG_COUPLED BIT(1) /* state applies to multiple cpus */ > > #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */ > > +#define CPUIDLE_FLAG_UNUSABLE BIT(3) /* avoid using this state */ > > > > struct cpuidle_device_kobj; > > struct cpuidle_state_kobj; > > Index: linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > > =================================================================== > > --- linux-pm.orig/arch/sh/kernel/cpu/shmobile/cpuidle.c > > +++ linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > > @@ -67,7 +67,7 @@ static struct cpuidle_driver cpuidle_dri > > .enter = cpuidle_sleep_enter, > > .name = "C2", > > .desc = "SuperH Sleep Mode [SF]", > > - .disabled = true, > > + .flags = CPUIDLE_FLAG_UNUSABLE, > > }, > > { > > .exit_latency = 2300, > > @@ -76,7 +76,7 @@ static struct cpuidle_driver cpuidle_dri > > .enter = cpuidle_sleep_enter, > > .name = "C3", > > .desc = "SuperH Mobile Standby Mode [SF]", > > - .disabled = true, > > + .flags = CPUIDLE_FLAG_UNUSABLE, > > }, > > }, > > .safe_state_index = 0, > > @@ -86,10 +86,10 @@ static struct cpuidle_driver cpuidle_dri > > int __init sh_mobile_setup_cpuidle(void) > > { > > if (sh_mobile_sleep_supported & SUSP_SH_SF) > > - cpuidle_driver.states[1].disabled = false; > > + cpuidle_driver.states[1].flags = CPUIDLE_FLAG_NONE; > > That will overwrite other flags value, bit operation should be used here > to remove CPUIDLE_FLAG_UNUSABLE. This is based on the observation that the other flags are not set by this driver anyway. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] cpuidle: Drop disabled field from struct cpuidle_state @ 2019-12-05 12:02 ` Rafael J. Wysocki 0 siblings, 0 replies; 8+ messages in thread From: Rafael J. Wysocki @ 2019-12-05 12:02 UTC (permalink / raw) To: Daniel Lezcano Cc: Rafael J. Wysocki, Linux PM, LKML, Srinivas Pandruvada, Len Brown, Len Brown, Rafael Wysocki, Yoshinori Sato, Rich Felker, Linux-sh list On Thu, Dec 5, 2019 at 12:15 PM Daniel Lezcano <daniel.lezcano@linaro.org> wrote: > > On 21/11/2019 19:41, Rafael J. Wysocki wrote: > > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > > > After recent cpuidle updates the "disabled" field in struct > > cpuidle_state is only used by two drivers (intel_idle and shmobile > > cpuidle) for marking unusable idle states, but that may as well be > > achieved with the help of a state flag, so define an "unusable" idle > > state flag, CPUIDLE_FLAG_UNUSABLE, make the drivers in question use > > it instead of the "disabled" field and make the core set > > CPUIDLE_STATE_DISABLED_BY_DRIVER for the idle states with that flag > > set. > > > > After the above changes, the "disabled" field in struct cpuidle_state > > is not used any more, so drop it. > > > > No intentional functional impact. > > > > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > --- > > > > Changes from RFC: > > > > - Do not add extra braces (unrelated to the rest of the patch). > > > > --- > > arch/sh/kernel/cpu/shmobile/cpuidle.c | 8 ++++---- > > drivers/cpuidle/cpuidle.c | 2 +- > > drivers/cpuidle/poll_state.c | 1 - > > drivers/idle/intel_idle.c | 6 +++--- > > include/linux/cpuidle.h | 2 +- > > 5 files changed, 9 insertions(+), 10 deletions(-) > > > > Index: linux-pm/drivers/idle/intel_idle.c > > =================================> > --- linux-pm.orig/drivers/idle/intel_idle.c > > +++ linux-pm/drivers/idle/intel_idle.c > > @@ -1291,8 +1291,8 @@ static void sklh_idle_state_table_update > > return; > > } > > > > - skl_cstates[5].disabled = 1; /* C8-SKL */ > > - skl_cstates[6].disabled = 1; /* C9-SKL */ > > + skl_cstates[5].flags |= CPUIDLE_FLAG_UNUSABLE; /* C8-SKL */ > > + skl_cstates[6].flags |= CPUIDLE_FLAG_UNUSABLE; /* C9-SKL */ > > } > > /* > > * intel_idle_state_table_update() > > @@ -1355,7 +1355,7 @@ static void __init intel_idle_cpuidle_dr > > continue; > > > > /* if state marked as disabled, skip it */ > > - if (cpuidle_state_table[cstate].disabled != 0) { > > + if (cpuidle_state_table[cstate].flags & CPUIDLE_FLAG_UNUSABLE) { > > pr_debug("state %s is disabled\n", > > cpuidle_state_table[cstate].name); > > continue; > > Index: linux-pm/include/linux/cpuidle.h > > =================================> > --- linux-pm.orig/include/linux/cpuidle.h > > +++ linux-pm/include/linux/cpuidle.h > > @@ -54,7 +54,6 @@ struct cpuidle_state { > > unsigned int exit_latency; /* in US */ > > int power_usage; /* in mW */ > > unsigned int target_residency; /* in US */ > > - bool disabled; /* disabled on all CPUs */ > > > > int (*enter) (struct cpuidle_device *dev, > > struct cpuidle_driver *drv, > > @@ -77,6 +76,7 @@ struct cpuidle_state { > > #define CPUIDLE_FLAG_POLLING BIT(0) /* polling state */ > > #define CPUIDLE_FLAG_COUPLED BIT(1) /* state applies to multiple cpus */ > > #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */ > > +#define CPUIDLE_FLAG_UNUSABLE BIT(3) /* avoid using this state */ > > > > struct cpuidle_device_kobj; > > struct cpuidle_state_kobj; > > Index: linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > > =================================> > --- linux-pm.orig/arch/sh/kernel/cpu/shmobile/cpuidle.c > > +++ linux-pm/arch/sh/kernel/cpu/shmobile/cpuidle.c > > @@ -67,7 +67,7 @@ static struct cpuidle_driver cpuidle_dri > > .enter = cpuidle_sleep_enter, > > .name = "C2", > > .desc = "SuperH Sleep Mode [SF]", > > - .disabled = true, > > + .flags = CPUIDLE_FLAG_UNUSABLE, > > }, > > { > > .exit_latency = 2300, > > @@ -76,7 +76,7 @@ static struct cpuidle_driver cpuidle_dri > > .enter = cpuidle_sleep_enter, > > .name = "C3", > > .desc = "SuperH Mobile Standby Mode [SF]", > > - .disabled = true, > > + .flags = CPUIDLE_FLAG_UNUSABLE, > > }, > > }, > > .safe_state_index = 0, > > @@ -86,10 +86,10 @@ static struct cpuidle_driver cpuidle_dri > > int __init sh_mobile_setup_cpuidle(void) > > { > > if (sh_mobile_sleep_supported & SUSP_SH_SF) > > - cpuidle_driver.states[1].disabled = false; > > + cpuidle_driver.states[1].flags = CPUIDLE_FLAG_NONE; > > That will overwrite other flags value, bit operation should be used here > to remove CPUIDLE_FLAG_UNUSABLE. This is based on the observation that the other flags are not set by this driver anyway. ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/2] cpuidle: Allow idle states to be disabled by default 2019-11-21 18:35 [PATCH 0/2] cpuidle: Allow CPU idle states to be disabled by default Rafael J. Wysocki 2019-11-21 18:41 ` Rafael J. Wysocki @ 2019-11-21 18:44 ` Rafael J. Wysocki 1 sibling, 0 replies; 8+ messages in thread From: Rafael J. Wysocki @ 2019-11-21 18:44 UTC (permalink / raw) To: Linux PM Cc: LKML, Srinivas Pandruvada, Len Brown, Daniel Lezcano, Len Brown, Rafael Wysocki From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> In certain situations it may be useful to prevent some idle states from being used by default while allowing user space to enable them later on. For this purpose, introduce a new state flag, CPUIDLE_FLAG_OFF, to mark idle states that should be disabled by default, make the core set CPUIDLE_STATE_DISABLED_BY_USER for those states at the initialization time and add a new state attribute in sysfs, "initial_status", to inform user space of the initial status of the given idle state ("disabled" if CPUIDLE_FLAG_OFF is set for it, "enabled" otherwise). Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> --- Changes from RFC: - Rename the new flag to CPUIDLE_FLAG_OFF. - Rename the new sysfs attribute to initial_status. - Fix typos in the documentation. --- Documentation/ABI/testing/sysfs-devices-system-cpu | 6 ++++++ Documentation/admin-guide/pm/cpuidle.rst | 3 +++ drivers/cpuidle/cpuidle.c | 6 +++++- drivers/cpuidle/sysfs.c | 10 ++++++++++ include/linux/cpuidle.h | 1 + 5 files changed, 25 insertions(+), 1 deletion(-) Index: linux-pm/drivers/cpuidle/sysfs.c =================================================================== --- linux-pm.orig/drivers/cpuidle/sysfs.c +++ linux-pm/drivers/cpuidle/sysfs.c @@ -327,6 +327,14 @@ static ssize_t store_state_disable(struc return size; } +static ssize_t show_state_initial_status(struct cpuidle_state *state, + struct cpuidle_state_usage *state_usage, + char *buf) +{ + return sprintf(buf, "%s\n", + state->flags & CPUIDLE_FLAG_OFF ? "disabled" : "enabled"); +} + define_one_state_ro(name, show_state_name); define_one_state_ro(desc, show_state_desc); define_one_state_ro(latency, show_state_exit_latency); @@ -337,6 +345,7 @@ define_one_state_ro(time, show_state_tim define_one_state_rw(disable, show_state_disable, store_state_disable); define_one_state_ro(above, show_state_above); define_one_state_ro(below, show_state_below); +define_one_state_ro(initial_status, show_state_initial_status); static struct attribute *cpuidle_state_default_attrs[] = { &attr_name.attr, @@ -349,6 +358,7 @@ static struct attribute *cpuidle_state_d &attr_disable.attr, &attr_above.attr, &attr_below.attr, + &attr_initial_status.attr, NULL }; Index: linux-pm/include/linux/cpuidle.h =================================================================== --- linux-pm.orig/include/linux/cpuidle.h +++ linux-pm/include/linux/cpuidle.h @@ -77,6 +77,7 @@ struct cpuidle_state { #define CPUIDLE_FLAG_COUPLED BIT(1) /* state applies to multiple cpus */ #define CPUIDLE_FLAG_TIMER_STOP BIT(2) /* timer is stopped on this state */ #define CPUIDLE_FLAG_UNUSABLE BIT(3) /* avoid using this state */ +#define CPUIDLE_FLAG_OFF BIT(4) /* disable this state by default */ struct cpuidle_device_kobj; struct cpuidle_state_kobj; Index: linux-pm/drivers/cpuidle/cpuidle.c =================================================================== --- linux-pm.orig/drivers/cpuidle/cpuidle.c +++ linux-pm/drivers/cpuidle/cpuidle.c @@ -569,10 +569,14 @@ static int __cpuidle_register_device(str if (!try_module_get(drv->owner)) return -EINVAL; - for (i = 0; i < drv->state_count; i++) + for (i = 0; i < drv->state_count; i++) { if (drv->states[i].flags & CPUIDLE_FLAG_UNUSABLE) dev->states_usage[i].disable |= CPUIDLE_STATE_DISABLED_BY_DRIVER; + if (drv->states[i].flags & CPUIDLE_FLAG_OFF) + dev->states_usage[i].disable |= CPUIDLE_STATE_DISABLED_BY_USER; + } + per_cpu(cpuidle_devices, dev->cpu) = dev; list_add(&dev->device_list, &cpuidle_detected_devices); Index: linux-pm/Documentation/ABI/testing/sysfs-devices-system-cpu =================================================================== --- linux-pm.orig/Documentation/ABI/testing/sysfs-devices-system-cpu +++ linux-pm/Documentation/ABI/testing/sysfs-devices-system-cpu @@ -196,6 +196,12 @@ Description: does not reflect it. Likewise, if one enables a deep state but a lighter state still is disabled, then this has no effect. +What: /sys/devices/system/cpu/cpuX/cpuidle/stateN/initial_status +Date: November 2019 +KernelVersion: v5.6 +Contact: Linux power management list <linux-pm@vger.kernel.org> +Description: + (RO) The initial status of this state, "enabled" or "disabled". What: /sys/devices/system/cpu/cpuX/cpuidle/stateN/residency Date: March 2014 Index: linux-pm/Documentation/admin-guide/pm/cpuidle.rst =================================================================== --- linux-pm.orig/Documentation/admin-guide/pm/cpuidle.rst +++ linux-pm/Documentation/admin-guide/pm/cpuidle.rst @@ -506,6 +506,9 @@ object corresponding to it, as follows: ``disable`` Whether or not this idle state is disabled. +``initial_status`` + The initial status of this state, "enabled" or "disabled". + ``latency`` Exit latency of the idle state in microseconds. ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2019-12-05 12:02 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-11-21 18:35 [PATCH 0/2] cpuidle: Allow CPU idle states to be disabled by default Rafael J. Wysocki 2019-11-21 18:41 ` [PATCH 1/2] cpuidle: Drop disabled field from struct cpuidle_state Rafael J. Wysocki 2019-11-21 18:41 ` Rafael J. Wysocki 2019-12-05 11:15 ` Daniel Lezcano 2019-12-05 11:15 ` Daniel Lezcano 2019-12-05 12:02 ` Rafael J. Wysocki 2019-12-05 12:02 ` Rafael J. Wysocki 2019-11-21 18:44 ` [PATCH 2/2] cpuidle: Allow idle states to be disabled by default Rafael J. Wysocki
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.