ACPI and power management fixes for 3.11-rc4

- Revert two cpuidle commits added during the 3.8 development cycle that
  turn out to have introduced a significant performance regression as
  requested by Jeremy Eder.

- The recent patches that made the freezer less heavy-weight introduced
  a regression causing user-space-driven hibernation using the ioctl()
  interface to block indefinitely when the hibernate process executes
  try_to_freeze().  Fix from Colin Cross addresses this by adding a
  process flag to mark the hibernate/suspend process to inform the
  freezer that that process should be ignored.

- One of the recent cpufreq reverts uncovered a problem in the core
  causing the cpufreq driver module refcount to become negative after
  a system suspend-resume cycle.  Fix from Rafael J Wysocki.

- The evaluation of the ACPI battery _BIX method has never worked
  correctly, because the commit that added support for it forgot to
  take the "Revision" field in the return package into account.  As
  a result, the reading of battery info doesn't work at all on some
  systems, which is addressed by a fix from Lan Tianyu.

/
freezer: set PF_SUSPEND_TASK flag on tasks that call freeze_processes

Calling freeze_processes sets a global flag that will cause any
process that calls try_to_freeze to enter the refrigerator.  It
skips sending a signal to the current task, but if the current
task ever hits try_to_freeze, all threads will be frozen and the
system will deadlock.

Set a new flag, PF_SUSPEND_TASK, on the task that calls
freeze_processes.  The flag notifies the freezer that the thread
is involved in suspend and should not be frozen.  Also add a
WARN_ON in thaw_processes if the caller does not have the
PF_SUSPEND_TASK flag set to catch if a different task calls
thaw_processes than the one that called freeze_processes, leaving
a task with PF_SUSPEND_TASK permanently set on it.

Threads that spawn off a task with PF_SUSPEND_TASK set (which
swsusp does) will also have PF_SUSPEND_TASK set, preventing them
from freezing while they are helping with suspend, but they need
to be dead by the time suspend is triggered, otherwise they may
run when userspace is expected to be frozen.  Add a WARN_ON in
thaw_processes if more than one thread has the PF_SUSPEND_TASK
flag set.

Reported-and-tested-by: Michael Leun <lkml20130126@newton.leun.net>
Signed-off-by: Colin Cross <ccross@android.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
3 files changed