From: ShuoX Liu <shuox.liu@intel.com>
To: "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Greg KH <gregkh@linuxfoundation.org>,
Yanmin Zhang <yanmin_zhang@linux.intel.com>,
"H. Peter Anvin" <hpa@zytor.com>,
"Valentin, Eduardo" <eduardo.valentin@ti.com>,
Henrique de Moraes Holschuh <hmh@hmh.eng.br>,
"Brown, Len" <len.brown@intel.com>,
Thomas Gleixner <tglx@linutronix.de>,
Andrew Morton <akpm@linux-foundation.org>,
Ingo Molnar <mingo@elte.hu>, "Kleen, Andi" <andi.kleen@intel.com>,
"linux-pm@lists.linux-foundation.org"
<linux-pm@lists.linux-foundation.org>
Subject: [PATCH 2/3] cpuidle: Add a debugfs entry to disable specific C state for debug purpose.
Date: Mon, 12 Mar 2012 17:21:33 +0800 [thread overview]
Message-ID: <4F5DC01D.7040006@intel.com> (raw)
In-Reply-To: <4F5DBFA8.3080300@intel.com>
From: ShuoX Liu <shuox.liu@intel.com>
Some C states of new CPU might be not good. One reason is BIOS might
configure
them incorrectly. To help developers root cause it quickly, the patch adds a
new debugfs entry, so developers could disable specific C state manually.
In addition, C state might have much impact on performance tuning, as it
takes
much time to enter/exit C states, which might delay interrupt
processing. With
the new debug option, developers could check if a deep C state could impact
performance and how much impact it could cause.
Also add this option in Documentation/cpuidle/debugfs.txt.
Signed-off-by: ShuoX Liu <shuox.liu@intel.com>
Reviewed-by: Yanmin Zhang <yanmin_zhang@intel.com>
---
Documentation/cpuidle/debugfs.txt | 5 +++++
drivers/cpuidle/cpuidle.c | 1 +
drivers/cpuidle/debugfs.c | 4 ++++
drivers/cpuidle/governors/menu.c | 5 ++++-
include/linux/cpuidle.h | 1 +
5 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/Documentation/cpuidle/debugfs.txt
b/Documentation/cpuidle/debugfs.txt
index 7724a69..ca393ba 100644
--- a/Documentation/cpuidle/debugfs.txt
+++ b/Documentation/cpuidle/debugfs.txt
@@ -20,6 +20,7 @@ drwxr-xr-x 2 root root 0 Feb 8 10:42 state3
/sys/kernel/debug/cpu/cpu0/cpuidle/state0:
total 0
-r--r--r-- 1 root root 4096 Feb 8 10:42 desc
+-rw-r--r-- 1 root root 4096 Feb 8 10:42 disable
-r--r--r-- 1 root root 4096 Feb 8 10:42 latency
-r--r--r-- 1 root root 4096 Feb 8 10:42 name
-r--r--r-- 1 root root 4096 Feb 8 10:42 power
@@ -29,6 +30,7 @@ total 0
/sys/kernel/debug/cpu/cpu0/cpuidle/state1:
total 0
-r--r--r-- 1 root root 4096 Feb 8 10:42 desc
+-rw-r--r-- 1 root root 4096 Feb 8 10:42 disable
-r--r--r-- 1 root root 4096 Feb 8 10:42 latency
-r--r--r-- 1 root root 4096 Feb 8 10:42 name
-r--r--r-- 1 root root 4096 Feb 8 10:42 power
@@ -38,6 +40,7 @@ total 0
/sys/kernel/debug/cpu/cpu0/cpuidle/state2:
total 0
-r--r--r-- 1 root root 4096 Feb 8 10:42 desc
+-rw-r--r-- 1 root root 4096 Feb 8 10:42 disable
-r--r--r-- 1 root root 4096 Feb 8 10:42 latency
-r--r--r-- 1 root root 4096 Feb 8 10:42 name
-r--r--r-- 1 root root 4096 Feb 8 10:42 power
@@ -47,6 +50,7 @@ total 0
/sys/kernel/debug/cpu/cpu0/cpuidle/state3:
total 0
-r--r--r-- 1 root root 4096 Feb 8 10:42 desc
+-rw-r--r-- 1 root root 4096 Feb 8 10:42 disable
-r--r--r-- 1 root root 4096 Feb 8 10:42 latency
-r--r--r-- 1 root root 4096 Feb 8 10:42 name
-r--r--r-- 1 root root 4096 Feb 8 10:42 power
@@ -56,6 +60,7 @@ total 0
* desc : Small description about the idle state (string)
+* disable : Option to disable this idle state (bool)
* latency : Latency to exit out of this idle state (in microseconds)
* name : Name of the idle state (string)
* power : Power consumed while in this idle state (in milliwatts)
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index b4946bc..fdaadb3 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -197,6 +197,7 @@ static void poll_idle_init(struct cpuidle_driver *drv)
state->power_usage = -1;
state->flags = 0;
state->enter = poll_idle;
+ state->disable = 0;
}
#else
static void poll_idle_init(struct cpuidle_driver *drv) {}
diff --git a/drivers/cpuidle/debugfs.c b/drivers/cpuidle/debugfs.c
index 67ddc44..197ce72 100644
--- a/drivers/cpuidle/debugfs.c
+++ b/drivers/cpuidle/debugfs.c
@@ -87,6 +87,10 @@ static void debugfs_add_state_attrs(struct
cpuidle_dev_state *dev_state)
parent, &state_usage->time))
goto error;
+ if (!debugfs_create_bool("disable", S_IRUGO | S_IWUSR,
+ parent, &state->disable))
+ goto error;
+
return;
error:
debugfs_remove_recursive(parent);
diff --git a/drivers/cpuidle/governors/menu.c
b/drivers/cpuidle/governors/menu.c
index ad09526..5c17ca1 100644
--- a/drivers/cpuidle/governors/menu.c
+++ b/drivers/cpuidle/governors/menu.c
@@ -280,7 +280,8 @@ static int menu_select(struct cpuidle_driver *drv,
struct cpuidle_device *dev)
* We want to default to C1 (hlt), not to busy polling
* unless the timer is happening really really soon.
*/
- if (data->expected_us > 5)
+ if (data->expected_us > 5 &&
+ drv->states[CPUIDLE_DRIVER_STATE_START].disable == 0)
data->last_state_idx = CPUIDLE_DRIVER_STATE_START;
/*
@@ -290,6 +291,8 @@ static int menu_select(struct cpuidle_driver *drv,
struct cpuidle_device *dev)
for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) {
struct cpuidle_state *s = &drv->states[i];
+ if (s->disable)
+ continue;
if (s->target_residency > data->predicted_us)
continue;
if (s->exit_latency > latency_req)
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h
index f605d28..a85877d 100644
--- a/include/linux/cpuidle.h
+++ b/include/linux/cpuidle.h
@@ -45,6 +45,7 @@ struct cpuidle_state {
unsigned int exit_latency; /* in US */
unsigned int power_usage; /* in mW */
unsigned int target_residency; /* in US */
+ unsigned int disable;
int (*enter) (struct cpuidle_device *dev,
struct cpuidle_driver *drv,
--
1.7.1
next prev parent reply other threads:[~2012-03-12 9:21 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-29 4:55 Subject: [PATCH] cpuidle: Add a sysfs entry to disable specific C state for debug purpose Liu, ShuoX
2012-03-02 0:17 ` Yanmin Zhang
2012-03-02 22:23 ` Andrew Morton
2012-03-05 1:34 ` Yanmin Zhang
2012-03-05 3:22 ` Liu, ShuoX
2012-03-05 6:16 ` Deepthi Dharwar
2012-03-05 6:16 ` Deepthi Dharwar
2012-03-05 7:09 ` [PATCH V3] " ShuoX Liu
2012-03-05 10:18 ` Henrique de Moraes Holschuh
2012-03-05 12:20 ` Valentin, Eduardo
2012-03-05 12:20 ` [linux-pm] " Valentin, Eduardo
2012-03-06 1:54 ` Yanmin Zhang
2012-03-06 5:22 ` Greg KH
2012-03-06 5:51 ` Yanmin Zhang
2012-03-06 14:39 ` Greg KH
[not found] ` <1331082051.1916.124.camel@ymzhang>
[not found] ` <20120308180106.GD26516@kroah.com>
2012-03-12 9:19 ` [PATCH 1/3] cpuidle: Move cpuidle sysfs entry of each cpu to debugfs ShuoX Liu
2012-03-12 9:21 ` ShuoX Liu [this message]
2012-03-12 20:46 ` [PATCH 2/3] cpuidle: Add a debugfs entry to disable specific C state for debug purpose Matthew Garrett
2012-03-12 20:46 ` Matthew Garrett
2012-03-12 9:23 ` [PATCH 3/3] cpupower: Update the cpupower tool for new debugfs entries of cpuidle ShuoX Liu
2012-03-12 17:22 ` [PATCH 1/3] cpuidle: Move cpuidle sysfs entry of each cpu to debugfs Greg KH
2012-03-13 2:07 ` ShuoX Liu
2012-03-12 18:11 ` [PATCH V3] cpuidle: Add a sysfs entry to disable specific C state for debug purpose Mark Brown
2012-03-12 18:11 ` [linux-pm] " Mark Brown
2012-03-12 19:29 ` Greg KH
2012-03-13 1:36 ` Yanmin Zhang
2012-03-13 19:29 ` Greg KH
2012-03-14 0:55 ` Yanmin Zhang
2012-03-14 2:46 ` Greg KH
2012-03-14 3:24 ` [linux-pm] [PATCH v4] " ShuoX Liu
2012-03-16 0:23 ` Yanmin Zhang
2012-03-16 0:23 ` Yanmin Zhang
2012-03-16 21:33 ` Andrew Morton
2012-03-16 21:33 ` [linux-pm] " Andrew Morton
2012-03-18 13:38 ` Henrique de Moraes Holschuh
2012-03-18 13:38 ` [linux-pm] " Henrique de Moraes Holschuh
2012-03-16 22:23 ` Andrew Morton
2012-03-16 22:23 ` [linux-pm] " Andrew Morton
2012-03-06 1:04 ` [PATCH V3] " Yanmin Zhang
2012-03-13 0:42 ` Henrique de Moraes Holschuh
2012-03-13 0:42 ` Henrique de Moraes Holschuh
2012-03-13 1:18 ` Yanmin Zhang
2012-03-13 20:49 ` Henrique de Moraes Holschuh
2012-03-13 20:49 ` Henrique de Moraes Holschuh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4F5DC01D.7040006@intel.com \
--to=shuox.liu@intel.com \
--cc=akpm@linux-foundation.org \
--cc=andi.kleen@intel.com \
--cc=eduardo.valentin@ti.com \
--cc=gregkh@linuxfoundation.org \
--cc=hmh@hmh.eng.br \
--cc=hpa@zytor.com \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@lists.linux-foundation.org \
--cc=mingo@elte.hu \
--cc=tglx@linutronix.de \
--cc=yanmin_zhang@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.