All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>
To: rjw@sisk.pl, viresh.kumar@linaro.org, toralf.foerster@gmx.de,
	robert.jarzmik@intel.com, durgadoss.r@intel.com,
	tianyu.lan@intel.com, lantianyu1986@gmail.com,
	dirk.brandewie@gmail.com
Cc: stern@rowland.harvard.edu,
	"Srivatsa S. Bhat" <srivatsa.bhat@linux.vnet.ibm.com>,
	linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 6/8] cpufreq: Introduce a flag ('frozen') to separate full vs temporary init/teardown
Date: Fri, 12 Jul 2013 03:46:59 +0530	[thread overview]
Message-ID: <20130711221657.547.2293.stgit@srivatsabhat.in.ibm.com> (raw)
In-Reply-To: <20130711221419.547.69781.stgit@srivatsabhat.in.ibm.com>

During suspend/resume we would like to do a light-weight init/teardown of
CPUs in the cpufreq subsystem and preserve certain things such as sysfs files
etc across suspend/resume transitions. Add a flag called 'frozen' to help
distinguish the full init/teardown sequence from the light-weight one.

Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
---

 drivers/cpufreq/cpufreq.c |   66 ++++++++++++++++++++++++++++-----------------
 1 file changed, 41 insertions(+), 25 deletions(-)

diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
index efdb607..1128753 100644
--- a/drivers/cpufreq/cpufreq.c
+++ b/drivers/cpufreq/cpufreq.c
@@ -902,7 +902,7 @@ static void cpufreq_init_policy(struct cpufreq_policy *policy)
 
 #ifdef CONFIG_HOTPLUG_CPU
 static int cpufreq_add_policy_cpu(unsigned int cpu, unsigned int sibling,
-				  struct device *dev)
+				  struct device *dev, bool frozen)
 {
 	struct cpufreq_policy *policy;
 	int ret = 0, has_target = !!cpufreq_driver->target;
@@ -930,13 +930,15 @@ static int cpufreq_add_policy_cpu(unsigned int cpu, unsigned int sibling,
 		__cpufreq_governor(policy, CPUFREQ_GOV_LIMITS);
 	}
 
+	/* Don't touch sysfs links during light-weight init */
+	if (frozen)
+		return 0;
+
 	ret = sysfs_create_link(&dev->kobj, &policy->kobj, "cpufreq");
-	if (ret) {
+	if (ret)
 		cpufreq_cpu_put(policy);
-		return ret;
-	}
 
-	return 0;
+	return ret;
 }
 #endif
 
@@ -971,16 +973,8 @@ static void cpufreq_policy_free(struct cpufreq_policy *policy)
 	kfree(policy);
 }
 
-/**
- * cpufreq_add_dev - add a CPU device
- *
- * Adds the cpufreq interface for a CPU device.
- *
- * The Oracle says: try running cpufreq registration/unregistration concurrently
- * with with cpu hotplugging and all hell will break loose. Tried to clean this
- * mess up, but more thorough testing is needed. - Mathieu
- */
-static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
+static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
+			     bool frozen)
 {
 	unsigned int j, cpu = dev->id;
 	int ret = -ENOMEM;
@@ -1012,7 +1006,8 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
 		struct cpufreq_policy *cp = per_cpu(cpufreq_cpu_data, sibling);
 		if (cp && cpumask_test_cpu(cpu, cp->related_cpus)) {
 			read_unlock_irqrestore(&cpufreq_driver_lock, flags);
-			return cpufreq_add_policy_cpu(cpu, sibling, dev);
+			return cpufreq_add_policy_cpu(cpu, sibling, dev,
+						      frozen);
 		}
 	}
 	read_unlock_irqrestore(&cpufreq_driver_lock, flags);
@@ -1078,9 +1073,11 @@ static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
 	}
 	write_unlock_irqrestore(&cpufreq_driver_lock, flags);
 
-	ret = cpufreq_add_dev_interface(cpu, policy, dev);
-	if (ret)
-		goto err_out_unregister;
+	if (!frozen) {
+		ret = cpufreq_add_dev_interface(cpu, policy, dev);
+		if (ret)
+			goto err_out_unregister;
+	}
 
 	cpufreq_init_policy(policy);
 
@@ -1111,6 +1108,20 @@ module_out:
 	return ret;
 }
 
+/**
+ * cpufreq_add_dev - add a CPU device
+ *
+ * Adds the cpufreq interface for a CPU device.
+ *
+ * The Oracle says: try running cpufreq registration/unregistration concurrently
+ * with with cpu hotplugging and all hell will break loose. Tried to clean this
+ * mess up, but more thorough testing is needed. - Mathieu
+ */
+static int cpufreq_add_dev(struct device *dev, struct subsys_interface *sif)
+{
+	return __cpufreq_add_dev(dev, sif, false);
+}
+
 static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
 {
 	int j;
@@ -1129,7 +1140,7 @@ static void update_policy_cpu(struct cpufreq_policy *policy, unsigned int cpu)
 }
 
 static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *data,
-					   unsigned int old_cpu)
+					   unsigned int old_cpu, bool frozen)
 {
 	struct device *cpu_dev;
 	unsigned long flags;
@@ -1137,6 +1148,11 @@ static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *data,
 
 	/* first sibling now owns the new sysfs dir */
 	cpu_dev = get_cpu_device(cpumask_first(data->cpus));
+
+	/* Don't touch sysfs files during light-weight tear-down */
+	if (frozen)
+		return cpu_dev->id;
+
 	sysfs_remove_link(&cpu_dev->kobj, "cpufreq");
 	ret = kobject_move(&data->kobj, &cpu_dev->kobj);
 	if (ret) {
@@ -1168,7 +1184,7 @@ static int cpufreq_nominate_new_policy_cpu(struct cpufreq_policy *data,
  * This routine frees the rwsem before returning.
  */
 static int __cpufreq_remove_dev(struct device *dev,
-		struct subsys_interface *sif)
+				struct subsys_interface *sif, bool frozen)
 {
 	unsigned int cpu = dev->id, cpus, new_cpu;
 	unsigned long flags;
@@ -1206,11 +1222,11 @@ static int __cpufreq_remove_dev(struct device *dev,
 		cpumask_clear_cpu(cpu, data->cpus);
 	unlock_policy_rwsem_write(cpu);
 
-	if (cpu != data->cpu) {
+	if (cpu != data->cpu && !frozen) {
 		sysfs_remove_link(&dev->kobj, "cpufreq");
 	} else if (cpus > 1) {
 
-		new_cpu = cpufreq_nominate_new_policy_cpu(data, cpu);
+		new_cpu = cpufreq_nominate_new_policy_cpu(data, cpu, frozen);
 		if (new_cpu >= 0) {
 			WARN_ON(lock_policy_rwsem_write(cpu));
 			update_policy_cpu(data, new_cpu);
@@ -1264,7 +1280,7 @@ static int cpufreq_remove_dev(struct device *dev, struct subsys_interface *sif)
 	if (cpu_is_offline(cpu))
 		return 0;
 
-	retval = __cpufreq_remove_dev(dev, sif);
+	retval = __cpufreq_remove_dev(dev, sif, false);
 	return retval;
 }
 
@@ -1990,7 +2006,7 @@ static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
 			break;
 		case CPU_DOWN_PREPARE:
 		case CPU_DOWN_PREPARE_FROZEN:
-			__cpufreq_remove_dev(dev, NULL);
+			__cpufreq_remove_dev(dev, NULL, false);
 			break;
 		case CPU_DOWN_FAILED:
 		case CPU_DOWN_FAILED_FROZEN:


  parent reply	other threads:[~2013-07-11 22:20 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-11 22:15 [PATCH 0/8] Cpufreq, cpu hotplug, suspend/resume related fixes Srivatsa S. Bhat
2013-07-11 22:15 ` [PATCH 1/8] cpufreq: Revert commit a66b2e to fix cpufreq regression during suspend/resume Srivatsa S. Bhat
2013-07-12  7:18   ` Viresh Kumar
2013-07-13 12:46     ` Paul Bolle
2013-07-15  6:18       ` Srivatsa S. Bhat
2013-07-11 22:15 ` [PATCH 2/8] cpufreq: Fix misplaced call to cpufreq_update_policy() Srivatsa S. Bhat
2013-07-12  7:06   ` Viresh Kumar
2013-07-15  6:20     ` Srivatsa S. Bhat
2013-07-15 11:37       ` Rafael J. Wysocki
2013-07-11 22:16 ` [PATCH 3/8] cpufreq: Add helper to perform alloc/free of policy structure Srivatsa S. Bhat
2013-07-12  7:09   ` Viresh Kumar
2013-07-15  6:24     ` Srivatsa S. Bhat
2013-07-11 22:16 ` [PATCH 4/8] cpufreq: Extract non-interface related stuff from cpufreq_add_dev_interface Srivatsa S. Bhat
2013-07-12  7:17   ` Viresh Kumar
2013-07-11 22:16 ` [PATCH 5/8] cpufreq: Extract the handover of policy cpu to a helper function Srivatsa S. Bhat
2013-07-12  7:19   ` Viresh Kumar
2013-07-11 22:16 ` Srivatsa S. Bhat [this message]
2013-07-12  7:31   ` [PATCH 6/8] cpufreq: Introduce a flag ('frozen') to separate full vs temporary init/teardown Viresh Kumar
2013-07-11 22:17 ` [PATCH 7/8] cpufreq: Preserve policy structure across suspend/resume Srivatsa S. Bhat
2013-07-15  9:55   ` Viresh Kumar
2013-07-15 10:05     ` Srivatsa S. Bhat
2013-07-15 10:21       ` Viresh Kumar
2013-07-15 11:52         ` Srivatsa S. Bhat
2013-07-15 11:35       ` Rafael J. Wysocki
2013-07-15 11:53         ` Srivatsa S. Bhat
2013-07-16  6:15       ` Viresh Kumar
2013-07-16  8:56         ` Srivatsa S. Bhat
2013-07-16  9:10           ` Viresh Kumar
2013-07-16  9:29             ` Srivatsa S. Bhat
2013-07-16  9:35               ` Viresh Kumar
2013-07-16  9:54                 ` Srivatsa S. Bhat
2013-07-11 22:17 ` [PATCH 8/8] cpufreq: Perform light-weight init/teardown during suspend/resume Srivatsa S. Bhat
2013-07-11 22:25 ` [PATCH 0/8] Cpufreq, cpu hotplug, suspend/resume related fixes Jarzmik, Robert
2013-07-11 22:25   ` Jarzmik, Robert
2013-07-11 22:33 ` Rafael J. Wysocki
2013-07-11 22:23   ` Srivatsa S. Bhat
2013-07-16 15:15     ` Toralf Förster
2013-07-16 21:32       ` Rafael J. Wysocki
2013-07-17  5:03         ` Srivatsa S. Bhat
2013-07-17 15:27         ` Toralf Förster
2013-07-17 15:49           ` Srivatsa S. Bhat
2013-07-21  8:43             ` Srivatsa S. Bhat
2013-07-21  8:43               ` Srivatsa S. Bhat
2013-07-21  9:40               ` Toralf Förster
2013-07-21 10:38                 ` Srivatsa S. Bhat
2013-07-21 12:59               ` Rafael J. Wysocki
2013-07-15 17:38   ` Toralf Förster
2013-07-15 23:25     ` Rafael J. Wysocki
2013-07-13  9:23 ` Toralf Förster
2013-07-13 13:50   ` Toralf Förster
2013-07-15  6:40     ` Srivatsa S. Bhat
2013-07-15  8:27 ` Lan Tianyu
2013-07-15  8:43   ` Srivatsa S. Bhat

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=20130711221657.547.2293.stgit@srivatsabhat.in.ibm.com \
    --to=srivatsa.bhat@linux.vnet.ibm.com \
    --cc=dirk.brandewie@gmail.com \
    --cc=durgadoss.r@intel.com \
    --cc=lantianyu1986@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rjw@sisk.pl \
    --cc=robert.jarzmik@intel.com \
    --cc=stern@rowland.harvard.edu \
    --cc=tianyu.lan@intel.com \
    --cc=toralf.foerster@gmx.de \
    --cc=viresh.kumar@linaro.org \
    /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.