All of lore.kernel.org
 help / color / mirror / Atom feed
* [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

* [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

* 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

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.