1. 17 6月, 2014 1 次提交
  2. 16 5月, 2014 1 次提交
    • R
      ACPI / PM: Hold ACPI scan lock over the "freeze" sleep state · 1f0b6386
      Rafael J. Wysocki 提交于
      The "freeze" sleep state suffers from the same issue that was
      addressed by commit ad07277e (ACPI / PM: Hold acpi_scan_lock over
      system PM transitions) for ACPI sleep states, that is, things break
      if ->remove() is called for devices whose system resume callbacks
      haven't been executed yet.
      
      It also can be addressed in the same way, by holding the ACPI scan
      lock over the "freeze" sleep state and PM transitions to and from
      that state, but ->begin() and ->end() platform operations for the
      "freeze" sleep state are needed for this purpose.
      
      This change has been tested on Acer Aspire S5 with Thunderbolt.
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      1f0b6386
  3. 23 4月, 2014 1 次提交
    • S
      ARM: 8011/1: ARM hibernation / suspend-to-disk · 603fb42a
      Sebastian Capella 提交于
      Enable hibernation for ARM architectures and provide ARM
      architecture specific calls used during hibernation.
      
      The swsusp hibernation framework depends on the
      platform first having functional suspend/resume.
      
      Then, in order to enable hibernation on a given platform, a
      platform_hibernation_ops structure may need to be registered with
      the system in order to save/restore any SoC-specific / cpu specific
      state needing (re)init over a suspend-to-disk/resume-from-disk cycle.
      
      For example:
      
           - "secure" SoCs that have different sets of control registers
             and/or different CR reg access patterns.
      
           - SoCs with L2 caches as the activation sequence there is
             SoC-dependent; a full off-on cycle for L2 is not done
             by the hibernation support code.
      
           - SoCs requiring steps on wakeup _before_ the "generic" parts
             done by cpu_suspend / cpu_resume can work correctly.
      
           - SoCs having persistent state which is maintained during suspend
             and resume, but will be lost during the power off cycle after
             suspend-to-disk.
      
      This is a rebase/rework of Frank Hofmann's v5 hibernation patchset.
      Acked-by: NRuss Dill <Russ.Dill@ti.com>
      Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
      Signed-off-by: NSebastian Capella <sebastian.capella@linaro.org>
      Acked-by: NPavel Machek <pavel@ucw.cz>
      Reviewed-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
      [fixed duplicate virt_to_pfn() definition --rmk]
      Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      603fb42a
  4. 21 6月, 2013 1 次提交
    • J
      PM / Sleep: Print last wakeup source on failed wakeup_count write · bb177fed
      Julius Werner 提交于
      Commit a938da06 introduced a useful little log message to tell
      users/debuggers which wakeup source aborted a suspend.  However,
      this message is only printed if the abort happens during the
      in-kernel suspend path (after writing /sys/power/state).
      
      The full specification of the /sys/power/wakeup_count facility
      allows user-space power managers to double-check if wakeups have
      already happened before it actually tries to suspend (e.g. while it
      was running user-space pre-suspend hooks), by writing the last known
      wakeup_count value to /sys/power/wakeup_count.  This patch changes
      the sysfs handler for that node to also print said log message if
      that write fails, so that we can figure out the offending wakeup
      source for both kinds of suspend aborts.
      Signed-off-by: NJulius Werner <jwerner@chromium.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      bb177fed
  5. 10 2月, 2013 1 次提交
    • Z
      PM: Introduce suspend state PM_SUSPEND_FREEZE · 7e73c5ae
      Zhang Rui 提交于
      PM_SUSPEND_FREEZE state is a general state that
      does not need any platform specific support, it equals
      frozen processes + suspended devices + idle processors.
      
      Compared with PM_SUSPEND_MEMORY,
      PM_SUSPEND_FREEZE saves less power
      because the system is still in a running state.
      PM_SUSPEND_FREEZE has less resume latency because it does not
      touch BIOS, and the processors are in idle state.
      
      Compared with RTPM/idle,
      PM_SUSPEND_FREEZE saves more power as
      1. the processor has longer sleep time because processes are frozen.
         The deeper c-state the processor supports, more power saving we can get.
      2. PM_SUSPEND_FREEZE uses system suspend code path, thus we can get
         more power saving from the devices that does not have good RTPM support.
      
      This state is useful for
      1) platforms that do not have STR, or have a broken STR.
      2) platforms that have an extremely low power idle state,
         which can be used to replace STR.
      
      The following describes how PM_SUSPEND_FREEZE state works.
      1. echo freeze > /sys/power/state
      2. the processes are frozen.
      3. all the devices are suspended.
      4. all the processors are blocked by a wait queue
      5. all the processors idles and enters (Deep) c-state.
      6. an interrupt fires.
      7. a processor is woken up and handles the irq.
      8. if it is a general event,
         a) the irq handler runs and quites.
         b) goto step 4.
      9. if it is a real wake event, say, power button pressing, keyboard touch, mouse moving,
         a) the irq handler runs and activate the wakeup source
         b) wakeup_source_activate() notifies the wait queue.
         c) system starts resuming from PM_SUSPEND_FREEZE
      10. all the devices are resumed.
      11. all the processes are unfrozen.
      12. system is back to working.
      
      Known Issue:
      The wakeup of this new PM_SUSPEND_FREEZE state may behave differently
      from the previous suspend state.
      Take ACPI platform for example, there are some GPEs that only enabled
      when the system is in sleep state, to wake the system backk from S3/S4.
      But we are not touching these GPEs during transition to PM_SUSPEND_FREEZE.
      This means we may lose some wake event.
      But on the other hand, as we do not disable all the Interrupts during
      PM_SUSPEND_FREEZE, we may get some extra "wakeup" Interrupts, that are
      not available for S3/S4.
      
      The patches has been tested on an old Sony laptop, and here are the results:
      
      Average Power:
      1. RPTM/idle for half an hour:
         14.8W, 12.6W, 14.1W, 12.5W, 14.4W, 13.2W, 12.9W
      2. Freeze for half an hour:
         11W, 10.4W, 9.4W, 11.3W 10.5W
      3. RTPM/idle for three hours:
         11.6W
      4. Freeze for three hours:
         10W
      5. Suspend to Memory:
         0.5~0.9W
      
      Average Resume Latency:
      1. RTPM/idle with a black screen: (From pressing keyboard to screen back)
         Less than 0.2s
      2. Freeze: (From pressing power button to screen back)
         2.50s
      3. Suspend to Memory: (From pressing power button to screen back)
         4.33s
      
      >From the results, we can see that all the platforms should benefit from
      this patch, even if it does not have Low Power S0.
      Signed-off-by: NZhang Rui <rui.zhang@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      7e73c5ae
  6. 01 7月, 2012 1 次提交
  7. 02 5月, 2012 2 次提交
    • R
      PM / Sleep: Add "prevent autosleep time" statistics to wakeup sources · 55850945
      Rafael J. Wysocki 提交于
      Android uses one wakelock statistics that is only necessary for
      opportunistic sleep.  Namely, the prevent_suspend_time field
      accumulates the total time the given wakelock has been locked
      while "automatic suspend" was enabled.  Add an analogous field,
      prevent_sleep_time, to wakeup sources and make it behave in a similar
      way.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      55850945
    • R
      PM / Sleep: Implement opportunistic sleep, v2 · 7483b4a4
      Rafael J. Wysocki 提交于
      Introduce a mechanism by which the kernel can trigger global
      transitions to a sleep state chosen by user space if there are no
      active wakeup sources.
      
      It consists of a new sysfs attribute, /sys/power/autosleep, that
      can be written one of the strings returned by reads from
      /sys/power/state, an ordered workqueue and a work item carrying out
      the "suspend" operations.  If a string representing the system's
      sleep state is written to /sys/power/autosleep, the work item
      triggering transitions to that state is queued up and it requeues
      itself after every execution until user space writes "off" to
      /sys/power/autosleep.
      
      That work item enables the detection of wakeup events using the
      functions already defined in drivers/base/power/wakeup.c (with one
      small modification) and calls either pm_suspend(), or hibernate() to
      put the system into a sleep state.  If a wakeup event is reported
      while the transition is in progress, it will abort the transition and
      the "system suspend" work item will be queued up again.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Reviewed-by: NNeilBrown <neilb@suse.de>
      7483b4a4
  8. 18 2月, 2012 1 次提交
  9. 10 2月, 2012 1 次提交
  10. 30 1月, 2012 1 次提交
    • R
      PM / Sleep: Introduce "late suspend" and "early resume" of devices · cf579dfb
      Rafael J. Wysocki 提交于
      The current device suspend/resume phases during system-wide power
      transitions appear to be insufficient for some platforms that want
      to use the same callback routines for saving device states and
      related operations during runtime suspend/resume as well as during
      system suspend/resume.  In principle, they could point their
      .suspend_noirq() and .resume_noirq() to the same callback routines
      as their .runtime_suspend() and .runtime_resume(), respectively,
      but at least some of them require device interrupts to be enabled
      while the code in those routines is running.
      
      It also makes sense to have device suspend-resume callbacks that will
      be executed with runtime PM disabled and with device interrupts
      enabled in case someone needs to run some special code in that
      context during system-wide power transitions.
      
      Apart from this, .suspend_noirq() and .resume_noirq() were introduced
      as a workaround for drivers using shared interrupts and failing to
      prevent their interrupt handlers from accessing suspended hardware.
      It appears to be better not to use them for other porposes, or we may
      have to deal with some serious confusion (which seems to be happening
      already).
      
      For the above reasons, introduce new device suspend/resume phases,
      "late suspend" and "early resume" (and analogously for hibernation)
      whose callback will be executed with runtime PM disabled and with
      device interrupts enabled and whose callback pointers generally may
      point to runtime suspend/resume routines.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Reviewed-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
      Reviewed-by: NKevin Hilman <khilman@ti.com>
      cf579dfb
  11. 20 1月, 2012 1 次提交
    • S
      PM / Hibernate: Rewrite unlock_system_sleep() to fix s2disk regression · 72081624
      Srivatsa S. Bhat 提交于
      Commit 33e638b9, "PM / Sleep: Use the freezer_count() functions in
      [un]lock_system_sleep() APIs" introduced an undesirable change in the
      behaviour of unlock_system_sleep() since freezer_count() internally calls
      try_to_freeze() - which we don't need in unlock_system_sleep().
      
      And commit bcda53fa, "PM / Sleep: Replace mutex_[un]lock(&pm_mutex) with
      [un]lock_system_sleep()" made these APIs wide-spread. This caused a
      regression in suspend-to-disk where snapshot_read() and snapshot_write()
      were getting frozen due to the try_to_freeze embedded in
      unlock_system_sleep(), since these functions were invoked when the freezing
      condition was still in effect.
      
      Fix this by rewriting unlock_system_sleep() by open-coding freezer_count()
      and dropping the try_to_freeze() part. Not only will this fix the
      regression but this will also ensure that the API only does what it is
      intended to do, and nothing more, under the hood.
      
      While at it, make the code more correct and robust by ensuring that the
      PF_FREEZER_SKIP flag gets cleared with pm_mutex held, to avoid a race with
      the freezer.
      
      Also, to be on the safer side, open-code freezer_do_not_count() as well
      (inside lock_system_sleep()), to ensure that any unrelated modification to
      freezer[_do_not]_count() does not break things again!
      Reported-and-tested-by: NRafael J. Wysocki <rjw@sisk.pl>
      Signed-off-by: NSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
      Acked-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      72081624
  12. 09 12月, 2011 2 次提交
  13. 24 11月, 2011 1 次提交
    • S
      PM / Memory-hotplug: Avoid task freezing failures · 6a76b7a9
      Srivatsa S. Bhat 提交于
      The lock_system_sleep() function is used in the memory hotplug code at
      several places in order to implement mutual exclusion with hibernation.
      However, this function tries to acquire the 'pm_mutex' lock using
      mutex_lock() and hence blocks in TASK_UNINTERRUPTIBLE state if it doesn't
      get the lock. This would lead to task freezing failures and hence
      hibernation failure as a consequence, even though the hibernation call path
      successfully acquired the lock.
      
      But it is to be noted that, since this task tries to acquire pm_mutex, if it
      blocks due to this, we are *100% sure* that this task is not going to run
      as long as hibernation sequence is in progress, since hibernation releases
      'pm_mutex' only at the very end, when everything is done.
      And this means, this task is going to be anyway blocked for much more longer
      than what the freezer intends to achieve; which means, freezing and thawing
      doesn't really make any difference to this task!
      
      So, to fix freezing failures, we just ask the freezer to skip freezing this
      task, since it is already "frozen enough".
      
      But instead of calling freezer_do_not_count() and freezer_count() as it is,
      we use only the relevant parts of those functions, because restrictions
      such as 'the task should be a userspace one' etc., might not be relevant in
      this scenario.
      Signed-off-by: NSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
      Acked-by: NTejun Heo <tj@kernel.org>
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      6a76b7a9
  14. 17 10月, 2011 3 次提交
    • H
      PM / VT: Cleanup #if defined uglyness and fix compile error · 37cce26b
      H Hartley Sweeten 提交于
      Introduce the config option CONFIG_VT_CONSOLE_SLEEP in order to cleanup
      the #if defined ugliness for the vt suspend support functions. Note that
      CONFIG_VT_CONSOLE is already dependant on CONFIG_VT.
      
      The function pm_set_vt_switch is actually dependant on CONFIG_VT and not
      CONFIG_PM_SLEEP. This fixes a compile error when CONFIG_PM_SLEEP is
      not set:
      
      drivers/tty/vt/vt_ioctl.c:1794: error: redefinition of 'pm_set_vt_switch'
      include/linux/suspend.h:17: error: previous definition of 'pm_set_vt_switch' was here
      
      Also, remove the incorrect path from the comment in console.c.
      
      [rjw: Replaced #if defined() with #ifdef in suspend.h.]
      Signed-off-by: NH Hartley Sweeten <hsweeten@visionengravers.com>
      Acked-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      37cce26b
    • M
      PM / Hibernate: Include storage keys in hibernation image on s390 · 85055dd8
      Martin Schwidefsky 提交于
      For s390 there is one additional byte associated with each page,
      the storage key. This byte contains the referenced and changed
      bits and needs to be included into the hibernation image.
      If the storage keys are not restored to their previous state all
      original pages would appear to be dirty. This can cause
      inconsistencies e.g. with read-only filesystems.
      Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      85055dd8
    • S
      PM / Suspend: Add statistics debugfs file for suspend to RAM · 2a77c46d
      ShuoX Liu 提交于
      Record S3 failure time about each reason and the latest two failed
      devices' names in S3 progress.
      We can check it through 'suspend_stats' entry in debugfs.
      
      The motivation of the patch:
      
      We are enabling power features on Medfield. Comparing with PC/notebook,
      a mobile enters/exits suspend-2-ram (we call it s3 on Medfield) far
      more frequently. If it can't enter suspend-2-ram in time, the power
      might be used up soon.
      
      We often find sometimes, a device suspend fails. Then, system retries
      s3 over and over again. As display is off, testers and developers
      don't know what happens.
      
      Some testers and developers complain they don't know if system
      tries suspend-2-ram, and what device fails to suspend. They need
      such info for a quick check. The patch adds suspend_stats under
      debugfs for users to check suspend to RAM statistics quickly.
      
      If not using this patch, we have other methods to get info about
      what device fails. One is to turn on  CONFIG_PM_DEBUG, but users
      would get too much info and testers need recompile the system.
      
      In addition, dynamic debug is another good tool to dump debug info.
      But it still doesn't match our utilization scenario closely.
      1) user need write a user space parser to process the syslog output;
      2) Our testing scenario is we leave the mobile for at least hours.
         Then, check its status. No serial console available during the
         testing. One is because console would be suspended, and the other
         is serial console connecting with spi or HSU devices would consume
         power. These devices are powered off at suspend-2-ram.
      Signed-off-by: NShuoX Liu <shuox.liu@intel.com>
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      2a77c46d
  15. 26 7月, 2011 1 次提交
  16. 16 7月, 2011 1 次提交
    • M
      PM / Suspend: Add .suspend_again() callback to suspend_ops · 3b5fe852
      MyungJoo Ham 提交于
      A system or a device may need to control suspend/wakeup events. It may
      want to wakeup the system after a predefined amount of time or at a
      predefined event decided while entering suspend for polling or delayed
      work. Then, it may want to enter suspend again if its predefined wakeup
      condition is the only wakeup reason and there is no outstanding events;
      thus, it does not wakeup the userspace unnecessary or unnecessary
      devices and keeps suspended as long as possible (saving the power).
      
      Enabling a system to wakeup after a specified time can be easily
      achieved by using RTC. However, to enter suspend again immediately
      without invoking userland and unrelated devices, we need additional
      features in the suspend framework.
      
      Such need comes from:
      
       1. Monitoring a critical device status without interrupts that can
      wakeup the system. (in-suspend polling)
       An example is ambient temperature monitoring that needs to shut down
      the system or a specific device function if it is too hot or cold. The
      temperature of a specific device may be needed to be monitored as well;
      e.g., a charger monitors battery temperature in order to stop charging
      if overheated.
      
       2. Execute critical "delayed work" at suspend.
       A driver or a system/board may have a delayed work (or any similar
      things) that it wants to execute at the requested time.
       For example, some chargers want to check the battery voltage some
      time (e.g., 30 seconds) after the battery is fully charged and the
      charger has stopped. Then, the charger restarts charging if the voltage
      has dropped more than a threshold, which is smaller than "restart-charger"
      voltage, which is a threshold to restart charging regardless of the
      time passed.
      
      This patch allows to add "suspend_again" callback at struct
      platform_suspend_ops and let the "suspend_again" callback return true if
      the system is required to enter suspend again after the current instance
      of wakeup. Device-wise suspend_again implemented at dev_pm_ops or
      syscore is not done because: a) suspend_again feature is usually under
      platform-wise decision and controls the behavior of the whole platform
      and b) There are very limited devices related to the usage cases of
      suspend_again; chargers and temperature sensors are mentioned so far.
      
      With suspend_again callback registered at struct platform_suspend_ops
      suspend_ops in kernel/power/suspend.c with suspend_set_ops by the
      platform, the suspend framework tries to enter suspend again by
      looping suspend_enter() if suspend_again has returned true and there has
      been no errors in the suspending sequence or pending wakeups (by
      pm_wakeup_pending).
      
      Tested at Exynos4-NURI.
      
      [rjw: Fixed up kerneldoc comment for suspend_enter().]
      Signed-off-by: NMyungJoo Ham <myungjoo.ham@samsung.com>
      Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
      Acked-by: NPavel Machek <pavel@ucw.cz>
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      3b5fe852
  17. 12 4月, 2011 1 次提交
    • R
      PM / Hibernate: Introduce CONFIG_HIBERNATE_CALLBACKS · 1f112cee
      Rafael J. Wysocki 提交于
      Xen save/restore is going to use hibernate device callbacks for
      quiescing devices and putting them back to normal operations and it
      would need to select CONFIG_HIBERNATION for this purpose.  However,
      that also would cause the hibernate interfaces for user space to be
      enabled, which might confuse user space, because the Xen kernels
      don't support hibernation.  Moreover, it would be wasteful, as it
      would make the Xen kernels include a substantial amount of code that
      they would never use.
      
      To address this issue introduce new power management Kconfig option
      CONFIG_HIBERNATE_CALLBACKS, such that it will only select the code
      that is necessary for the hibernate device callbacks to work and make
      CONFIG_HIBERNATION select it.  Then, Xen save/restore will be able to
      select CONFIG_HIBERNATE_CALLBACKS without dragging the entire
      hibernate code along with it.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Tested-by: NShriram Rajagopalan <rshriram@cs.ubc.ca>
      1f112cee
  18. 15 3月, 2011 2 次提交
  19. 07 1月, 2011 2 次提交
  20. 24 12月, 2010 1 次提交
  21. 16 11月, 2010 2 次提交
  22. 17 10月, 2010 2 次提交
    • R
      PM: Allow wakeup events to abort freezing of tasks · dbeeec5f
      Rafael J. Wysocki 提交于
      If there is a wakeup event during the freezing of tasks, suspend or
      hibernation will fail anyway.  Since try_to_freeze_tasks() can take
      up to 20 seconds to complete or fail, aborting it as soon as a wakeup
      event is detected improves the worst case wakeup latency.
      
      Based on a patch from Arve Hjønnevåg.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NPavel Machek <pavel@ucw.cz>
      dbeeec5f
    • R
      PM / Wakeup: Introduce wakeup source objects and event statistics (v3) · 074037ec
      Rafael J. Wysocki 提交于
      Introduce struct wakeup_source for representing system wakeup sources
      within the kernel and for collecting statistics related to them.
      Make the recently introduced helper functions pm_wakeup_event(),
      pm_stay_awake() and pm_relax() use struct wakeup_source objects
      internally, so that wakeup statistics associated with wakeup devices
      can be collected and reported in a consistent way (the definition of
      pm_relax() is changed, which is harmless, because this function is
      not called directly by anyone yet).  Introduce new wakeup-related
      sysfs device attributes in /sys/devices/.../power for reporting the
      device wakeup statistics.
      
      Change the global wakeup events counters event_count and
      events_in_progress into atomic variables, so that it is not necessary
      to acquire a global spinlock in pm_wakeup_event(), pm_stay_awake()
      and pm_relax(), which should allow us to avoid lock contention in
      these functions on SMP systems with many wakeup devices.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      074037ec
  23. 19 7月, 2010 2 次提交
    • R
      PM / Suspend: Fix ordering of calls in suspend error paths · ce441011
      Rafael J. Wysocki 提交于
      The ACPI suspend code calls suspend_nvs_free() at a wrong place,
      which may lead to a memory leak if there's an error executing
      acpi_pm_prepare(), because acpi_pm_finish() will not be called in
      that case.  However, the root cause of this problem is the
      apparently confusing ordering of calls in suspend error paths that
      needs to be fixed.
      
      In addition to that, fix a typo in a label name in suspend.c.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NLen Brown <len.brown@intel.com>
      ce441011
    • R
      PM: Make it possible to avoid races between wakeup and system sleep · c125e96f
      Rafael J. Wysocki 提交于
      One of the arguments during the suspend blockers discussion was that
      the mainline kernel didn't contain any mechanisms making it possible
      to avoid races between wakeup and system suspend.
      
      Generally, there are two problems in that area.  First, if a wakeup
      event occurs exactly when /sys/power/state is being written to, it
      may be delivered to user space right before the freezer kicks in, so
      the user space consumer of the event may not be able to process it
      before the system is suspended.  Second, if a wakeup event occurs
      after user space has been frozen, it is not generally guaranteed that
      the ongoing transition of the system into a sleep state will be
      aborted.
      
      To address these issues introduce a new global sysfs attribute,
      /sys/power/wakeup_count, associated with a running counter of wakeup
      events and three helper functions, pm_stay_awake(), pm_relax(), and
      pm_wakeup_event(), that may be used by kernel subsystems to control
      the behavior of this attribute and to request the PM core to abort
      system transitions into a sleep state already in progress.
      
      The /sys/power/wakeup_count file may be read from or written to by
      user space.  Reads will always succeed (unless interrupted by a
      signal) and return the current value of the wakeup events counter.
      Writes, however, will only succeed if the written number is equal to
      the current value of the wakeup events counter.  If a write is
      successful, it will cause the kernel to save the current value of the
      wakeup events counter and to abort the subsequent system transition
      into a sleep state if any wakeup events are reported after the write
      has returned.
      
      [The assumption is that before writing to /sys/power/state user space
      will first read from /sys/power/wakeup_count.  Next, user space
      consumers of wakeup events will have a chance to acknowledge or
      veto the upcoming system transition to a sleep state.  Finally, if
      the transition is allowed to proceed, /sys/power/wakeup_count will
      be written to and if that succeeds, /sys/power/state will be written
      to as well.  Still, if any wakeup events are reported to the PM core
      by kernel subsystems after that point, the transition will be
      aborted.]
      
      Additionally, put a wakeup events counter into struct dev_pm_info and
      make these per-device wakeup event counters available via sysfs,
      so that it's possible to check the activity of various wakeup event
      sources within the kernel.
      
      To illustrate how subsystems can use pm_wakeup_event(), make the
      low-level PCI runtime PM wakeup-handling code use it.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NJesse Barnes <jbarnes@virtuousgeek.org>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Acked-by: Nmarkgross <markgross@thegnar.org>
      Reviewed-by: NAlan Stern <stern@rowland.harvard.edu>
      c125e96f
  24. 10 6月, 2010 1 次提交
  25. 18 11月, 2009 1 次提交
    • A
      mm: allow memory hotplug and hibernation in the same kernel · 6ad696d2
      Andi Kleen 提交于
      Allow memory hotplug and hibernation in the same kernel
      
      Memory hotplug and hibernation were exclusive in Kconfig.  This is
      obviously a problem for distribution kernels who want to support both in
      the same image.
      
      After some discussions with Rafael and others the only problem is with
      parallel memory hotadd or removal while a hibernation operation is in
      process.  It was also working for s390 before.
      
      This patch removes the Kconfig level exclusion, and simply makes the
      memory add / remove functions grab the pm_mutex to exclude against
      hibernation.
      
      Fixes a regression - old kernels didn't exclude memory hotadd and
      hibernation.
      Signed-off-by: NAndi Kleen <ak@linux.intel.com>
      Cc: Gerald Schaefer <gerald.schaefer@de.ibm.com>
      Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
      Cc: Yasunori Goto <y-goto@jp.fujitsu.com>
      Acked-by: NRafael J. Wysocki <rjw@sisk.pl>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      6ad696d2
  26. 13 6月, 2009 1 次提交
  27. 20 4月, 2009 1 次提交
    • R
      PM/Suspend: Introduce two new platform callbacks to avoid breakage · 6a7c7eaf
      Rafael J. Wysocki 提交于
      Commit 900af0d9 (PM: Change suspend
      code ordering) changed the ordering of suspend code in such a way
      that the platform .prepare() callback is now executed after the
      device drivers' late suspend callbacks have run.  Unfortunately, this
      turns out to break ARM platforms that need to talk via I2C to power
      control devices during the .prepare() callback.
      
      For this reason introduce two new platform suspend callbacks,
      .prepare_late() and .wake(), that will be called just prior to
      disabling non-boot CPUs and right after bringing them back on line,
      respectively, and use them instead of .prepare() and .finish() for
      ACPI suspend.  Make the PM core execute the .prepare() and .finish()
      platform suspend callbacks where they were executed previously (that
      is, right after calling the regular suspend methods provided by
      device drivers and right before executing their regular resume
      methods, respectively).
      
      It is not necessary to make analogous changes to the hibernation
      code and data structures at the moment, because they are only used
      by ACPI platforms.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Reported-by: NRussell King <rmk+kernel@arm.linux.org.uk>
      Acked-by: NLen Brown <len.brown@intel.com>
      6a7c7eaf
  28. 01 4月, 2009 1 次提交
  29. 27 1月, 2009 1 次提交
    • R
      Hibernation: Introduce system_entering_hibernation · abfe2d7b
      Rafael J. Wysocki 提交于
      Introduce boolean function system_entering_hibernation() returning
      'true' during the last phase of hibernation, in which devices are
      being put into low power states and the sleep state (for example,
      ACPI S4) is finally entered.
      
      Some device drivers need such a function to check if the system is
      in the final phase of hibernation.  In particular, some SATA drivers
      are going to use it for blacklisting systems in which the disks
      should not be spun down during the last phase of hibernation (the
      BIOS will do that anyway).
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Signed-off-by: NJeff Garzik <jgarzik@redhat.com>
      abfe2d7b
  30. 19 12月, 2008 1 次提交
    • R
      ACPI hibernate: Add a mechanism to save/restore ACPI NVS memory · 3f4b0ef7
      Rafael J. Wysocki 提交于
      According to the ACPI Specification 3.0b, Section 15.3.2,
      "OSPM will call the _PTS control method some time before entering a
      sleeping state, to allow the platform's AML code to update this
      memory image before entering the sleeping state. After the system
      awakes from an S4 state, OSPM will restore this memory area and call
      the _WAK control method to enable the BIOS to reclaim its memory
      image."  For this reason, implement a mechanism allowing us to save
      the NVS memory during hibernation and to restore it during the
      subsequent resume.
      
      Based on a patch by Zhang Rui.
      Signed-off-by: NRafael J. Wysocki <rjw@sisk.pl>
      Acked-by: NNigel Cunningham <nigel@tuxonice.net>
      Cc: Zhang Rui <rui.zhang@intel.com>
      Signed-off-by: NLen Brown <len.brown@intel.com>
      3f4b0ef7
  31. 15 8月, 2008 1 次提交