mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Trinabh Gupta <trinabh@linux.vnet.ibm.com>
To: arjan@linux.intel.com, peterz@infradead.org, lenb@kernel.org,
	suresh.b.siddha@intel.com, benh@kernel.crashing.org,
	venki@google.com, ak@linux.intel.com
Cc: linux-kernel@vger.kernel.org, sfr@canb.auug.org.au
Subject: [RFC PATCH V4 5/5] cpuidle: cpuidle driver for apm
Date: Tue, 22 Mar 2011 18:03:40 +0530	[thread overview]
Message-ID: <20110322123336.28725.29810.stgit@tringupt.in.ibm.com> (raw)
In-Reply-To: <20110322123208.28725.30945.stgit@tringupt.in.ibm.com>

Signed-off-by: Trinabh Gupta <trinabh@linux.vnet.ibm.com>
---

 arch/x86/kernel/apm_32.c |   75 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 60 insertions(+), 15 deletions(-)

diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index 0e4f24c..22d40bf 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -882,8 +882,6 @@ static void apm_do_busy(void)
 #define IDLE_CALC_LIMIT	(HZ * 100)
 #define IDLE_LEAKY_MAX	16
 
-static void (*original_pm_idle)(void) __read_mostly;
-
 /**
  * apm_cpu_idle		-	cpu idling for APM capable Linux
  *
@@ -947,10 +945,7 @@ recalc:
 				break;
 			}
 		}
-		if (original_pm_idle)
-			original_pm_idle();
-		else
-			default_idle();
+		default_idle();
 		local_irq_disable();
 		jiffies_since_last_check = jiffies - last_jiffies;
 		if (jiffies_since_last_check > idle_period)
@@ -2256,6 +2251,63 @@ static struct dmi_system_id __initdata apm_dmi_table[] = {
 	{ }
 };
 
+int apm_idle_wrapper(struct cpuidle_device *dev,
+		struct cpuidle_state *state)
+{
+	apm_cpu_idle();
+	return 0;
+}
+
+struct cpuidle_state state_apm_idle = {
+		.name = "APM-IDLE",
+		.desc = "APM idle routine",
+		.exit_latency = 1,
+		.target_residency = 1,
+		.enter = &apm_idle_wrapper,
+};
+
+static struct cpuidle_driver apm_idle_driver = {
+	.name = "apm_idle",
+	.owner = THIS_MODULE,
+	.priority = 1,
+};
+
+static int apm_setup_cpuidle(int cpu)
+{
+	struct cpuidle_device *dev = kzalloc(sizeof(struct cpuidle_device),
+					GFP_KERNEL);
+	int count = CPUIDLE_DRIVER_STATE_START;
+	dev->cpu = cpu;
+	dev->drv = &apm_idle_driver;
+
+	dev->states[count] = state_apm_idle;
+	count++;
+
+	dev->state_count = count;
+
+	if (cpuidle_register_device(dev))
+		return -EIO;
+	return 0;
+}
+
+static int apm_idle_init(void)
+{
+	int retval, i;
+	retval = cpuidle_register_driver(&apm_idle_driver);
+
+	for_each_online_cpu(i) {
+		apm_setup_cpuidle(i);
+	}
+
+	return 0;
+}
+
+static void apm_idle_exit(void)
+{
+	cpuidle_unregister_driver(&apm_idle_driver);
+	return;
+}
+
 /*
  * Just start the APM thread. We do NOT want to do APM BIOS
  * calls from anything but the APM thread, if for no other reason
@@ -2393,8 +2445,7 @@ static int __init apm_init(void)
 	if (HZ != 100)
 		idle_period = (idle_period * HZ) / 100;
 	if (idle_threshold < 100) {
-		original_pm_idle = pm_idle;
-		pm_idle  = apm_cpu_idle;
+		apm_idle_init();
 		set_pm_idle = 1;
 	}
 
@@ -2406,13 +2457,7 @@ static void __exit apm_exit(void)
 	int error;
 
 	if (set_pm_idle) {
-		pm_idle = original_pm_idle;
-		/*
-		 * We are about to unload the current idle thread pm callback
-		 * (pm_idle), Wait for all processors to update cached/local
-		 * copies of pm_idle before proceeding.
-		 */
-		cpu_idle_wait();
+		apm_idle_exit();
 	}
 	if (((apm_info.bios.flags & APM_BIOS_DISENGAGED) == 0)
 	    && (apm_info.connection_version > 0x0100)) {


  parent reply	other threads:[~2011-03-22 12:33 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-22 12:32 [RFC PATCH V4 0/5] cpuidle: Cleanup pm_idle and include driver/cpuidle.c in-kernel Trinabh Gupta
2011-03-22 12:32 ` [RFC PATCH V4 1/5] cpuidle: Remove pm_idle pointer for x86 Trinabh Gupta
2011-03-23  1:00   ` Stephen Rothwell
2011-03-23 10:10     ` Trinabh Gupta
2011-03-22 12:32 ` [RFC PATCH V4 2/5] cpuidle: list based cpuidle driver registration and selection Trinabh Gupta
2011-03-23  2:59   ` Len Brown
2011-03-23  9:22     ` Trinabh Gupta
2011-03-23 20:51       ` Len Brown
2011-03-24  4:41         ` Len Brown
2011-03-24 14:13         ` Trinabh Gupta
2011-03-24 16:52           ` Vaidyanathan Srinivasan
2011-03-25  7:13             ` Len Brown
2011-03-25  7:05           ` Len Brown
2011-03-25 15:35             ` [Xen-devel] " Konrad Rzeszutek Wilk
2011-03-31  2:25               ` Len Brown
2011-03-22 12:33 ` [RFC PATCH V4 3/5] cpuidle: default idle driver for x86 Trinabh Gupta
2011-03-23  3:13   ` Len Brown
2011-03-23  9:31     ` Trinabh Gupta
2011-03-24 16:32       ` Vaidyanathan Srinivasan
2011-03-22 12:33 ` [RFC PATCH V4 4/5] cpuidle: driver for xen Trinabh Gupta
2011-03-22 14:50   ` Konrad Rzeszutek Wilk
2011-03-23  9:57     ` Trinabh Gupta
2011-03-24  7:18       ` Len Brown
2011-03-24 12:05         ` Konrad Rzeszutek Wilk
2011-03-25  7:19           ` Len Brown
2011-03-25 14:43             ` [Xen-devel] " Jeremy Fitzhardinge
2011-03-25 14:38           ` Jeremy Fitzhardinge
2011-03-31  2:02             ` Len Brown
2011-03-31 21:26               ` Len Brown
2011-03-31 22:36                 ` Jeremy Fitzhardinge
2011-04-01  3:03                   ` Len Brown
2011-03-22 12:33 ` Trinabh Gupta [this message]
2011-03-23  1:14   ` [RFC PATCH V4 5/5] cpuidle: cpuidle driver for apm Stephen Rothwell
2011-03-23 10:25     ` Trinabh Gupta
2011-03-23 20:32       ` Len Brown
2011-03-24 14:28         ` Trinabh Gupta
2011-03-24 16:21           ` Vaidyanathan Srinivasan
2011-03-25  7:24           ` Len Brown
2011-03-25 18:01             ` Vaidyanathan Srinivasan
2011-03-31  2:17               ` cpuidle asymmetry (was Re: [RFC PATCH V4 5/5] cpuidle: cpuidle driver for apm) Len Brown
2011-03-31 13:18                 ` Peter Zijlstra
2011-04-01  4:09                   ` Len Brown
2011-04-01  8:15                     ` Dipankar Sarma
2011-04-01 14:38                       ` Arjan van de Ven
2011-04-03 16:18                         ` Dipankar Sarma
2011-04-01 14:02                     ` Peter Zijlstra
2011-04-04 14:32                       ` Dipankar Sarma
2011-04-05 15:01                         ` Peter Zijlstra
2011-04-05 15:48                           ` Dipankar Sarma
2011-04-01  7:02                 ` Trinabh Gupta
2011-03-24  4:27   ` [RFC PATCH V4 5/5] cpuidle: cpuidle driver for apm Len Brown

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=20110322123336.28725.29810.stgit@tringupt.in.ibm.com \
    --to=trinabh@linux.vnet.ibm.com \
    --cc=ak@linux.intel.com \
    --cc=arjan@linux.intel.com \
    --cc=benh@kernel.crashing.org \
    --cc=lenb@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=peterz@infradead.org \
    --cc=sfr@canb.auug.org.au \
    --cc=suresh.b.siddha@intel.com \
    --cc=venki@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®