On Sunday, July 28, 2013 12:21:22 PM Toralf Förster wrote: > On 07/28/2013 01:39 AM, Rafael J. Wysocki wrote: > > On Saturday, July 27, 2013 07:40:34 PM Toralf Förster wrote: > >> it gives at a ThinkPad T420: > >> > >> tfoerste@n22 ~/tmp $ lsmod | grep ^acpi_cpufreq > >> acpi_cpufreq 12902 2147483647 > > > > That is -1, which indicates some module refcount woes. > > yes, ofc. > > The issue apears after 1 s2ram/resume cycle, before s2ram the refcount is 1. > > > I definitely can't see that with the mainline on my machines. > > It is in mainline too. Does the appended patch help? Rafael --- From: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> Subject: cpufreq: Fix cpufreq driver module refcount balance after suspend/resume Since cpufreq_cpu_put() called by __cpufreq_remove_dev() drops the driver module refcount, the latter has to bump up that refcount to start with to balance the drop, or the cpufreq driver refcount will become negative after a suspend/resume cycle. Reported-by: Toralf Förster <toralf.foerster@xxxxxx> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> --- drivers/cpufreq/cpufreq.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) Index: linux-pm/drivers/cpufreq/cpufreq.c =================================================================== --- linux-pm.orig/drivers/cpufreq/cpufreq.c +++ linux-pm/drivers/cpufreq/cpufreq.c @@ -1016,6 +1016,9 @@ static int __cpufreq_remove_dev(struct d pr_debug("%s: unregistering CPU %u\n", __func__, cpu); + if (!try_module_get(cpufreq_driver->owner)) + return -EINVAL; + write_lock_irqsave(&cpufreq_driver_lock, flags); data = per_cpu(cpufreq_cpu_data, cpu); @@ -1025,7 +1028,8 @@ static int __cpufreq_remove_dev(struct d if (!data) { pr_debug("%s: No cpu_data found\n", __func__); - return -EINVAL; + ret = -EINVAL; + goto err; } if (cpufreq_driver->target) @@ -1063,9 +1067,9 @@ static int __cpufreq_remove_dev(struct d unlock_policy_rwsem_write(cpu); - ret = sysfs_create_link(&cpu_dev->kobj, &data->kobj, + sysfs_create_link(&cpu_dev->kobj, &data->kobj, "cpufreq"); - return -EINVAL; + goto err; } WARN_ON(lock_policy_rwsem_write(cpu)); @@ -1110,6 +1114,10 @@ static int __cpufreq_remove_dev(struct d per_cpu(cpufreq_policy_cpu, cpu) = -1; return 0; + + err: + module_put(cpufreq_driver->owner); + return ret; } -- To unsubscribe from this list: send the line "unsubscribe cpufreq" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html