You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'v3.9-rc3' into drm-intel-next-queued
Backmerge so that I can merge Imre Deak's coalesced sg entries fixes,
which depend upon the new for_each_sg_page introduce in
commit a321e91b6d
Author: Imre Deak <imre.deak@intel.com>
Date: Wed Feb 27 17:02:56 2013 -0800
lib/scatterlist: add simple page iterator
The merge itself is just two trivial conflicts:
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
@@ -66,7 +66,7 @@ static DECLARE_WORK(suspend_work, try_to_suspend);
|
||||
|
||||
void queue_up_suspend_work(void)
|
||||
{
|
||||
if (!work_pending(&suspend_work) && autosleep_state > PM_SUSPEND_ON)
|
||||
if (autosleep_state > PM_SUSPEND_ON)
|
||||
queue_work(autosleep_wq, &suspend_work);
|
||||
}
|
||||
|
||||
|
||||
+28
-1
@@ -313,7 +313,7 @@ static ssize_t state_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
static suspend_state_t decode_state(const char *buf, size_t n)
|
||||
{
|
||||
#ifdef CONFIG_SUSPEND
|
||||
suspend_state_t state = PM_SUSPEND_STANDBY;
|
||||
suspend_state_t state = PM_SUSPEND_MIN;
|
||||
const char * const *s;
|
||||
#endif
|
||||
char *p;
|
||||
@@ -553,6 +553,30 @@ power_attr(pm_trace_dev_match);
|
||||
|
||||
#endif /* CONFIG_PM_TRACE */
|
||||
|
||||
#ifdef CONFIG_FREEZER
|
||||
static ssize_t pm_freeze_timeout_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", freeze_timeout_msecs);
|
||||
}
|
||||
|
||||
static ssize_t pm_freeze_timeout_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t n)
|
||||
{
|
||||
unsigned long val;
|
||||
|
||||
if (kstrtoul(buf, 10, &val))
|
||||
return -EINVAL;
|
||||
|
||||
freeze_timeout_msecs = val;
|
||||
return n;
|
||||
}
|
||||
|
||||
power_attr(pm_freeze_timeout);
|
||||
|
||||
#endif /* CONFIG_FREEZER*/
|
||||
|
||||
static struct attribute * g[] = {
|
||||
&state_attr.attr,
|
||||
#ifdef CONFIG_PM_TRACE
|
||||
@@ -575,6 +599,9 @@ static struct attribute * g[] = {
|
||||
#ifdef CONFIG_PM_SLEEP_DEBUG
|
||||
&pm_print_times_attr.attr,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_FREEZER
|
||||
&pm_freeze_timeout_attr.attr,
|
||||
#endif
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
/*
|
||||
* Timeout for stopping processes
|
||||
*/
|
||||
#define TIMEOUT (20 * HZ)
|
||||
unsigned int __read_mostly freeze_timeout_msecs = 20 * MSEC_PER_SEC;
|
||||
|
||||
static int try_to_freeze_tasks(bool user_only)
|
||||
{
|
||||
@@ -36,7 +36,7 @@ static int try_to_freeze_tasks(bool user_only)
|
||||
|
||||
do_gettimeofday(&start);
|
||||
|
||||
end_time = jiffies + TIMEOUT;
|
||||
end_time = jiffies + msecs_to_jiffies(freeze_timeout_msecs);
|
||||
|
||||
if (!user_only)
|
||||
freeze_workqueues_begin();
|
||||
|
||||
+3
-6
@@ -359,8 +359,7 @@ void pm_qos_update_request(struct pm_qos_request *req,
|
||||
return;
|
||||
}
|
||||
|
||||
if (delayed_work_pending(&req->work))
|
||||
cancel_delayed_work_sync(&req->work);
|
||||
cancel_delayed_work_sync(&req->work);
|
||||
|
||||
if (new_value != req->node.prio)
|
||||
pm_qos_update_target(
|
||||
@@ -386,8 +385,7 @@ void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value,
|
||||
"%s called for unknown object.", __func__))
|
||||
return;
|
||||
|
||||
if (delayed_work_pending(&req->work))
|
||||
cancel_delayed_work_sync(&req->work);
|
||||
cancel_delayed_work_sync(&req->work);
|
||||
|
||||
if (new_value != req->node.prio)
|
||||
pm_qos_update_target(
|
||||
@@ -416,8 +414,7 @@ void pm_qos_remove_request(struct pm_qos_request *req)
|
||||
return;
|
||||
}
|
||||
|
||||
if (delayed_work_pending(&req->work))
|
||||
cancel_delayed_work_sync(&req->work);
|
||||
cancel_delayed_work_sync(&req->work);
|
||||
|
||||
pm_qos_update_target(pm_qos_array[req->pm_qos_class]->constraints,
|
||||
&req->node, PM_QOS_REMOVE_REQ,
|
||||
|
||||
+56
-13
@@ -30,12 +30,38 @@
|
||||
#include "power.h"
|
||||
|
||||
const char *const pm_states[PM_SUSPEND_MAX] = {
|
||||
[PM_SUSPEND_FREEZE] = "freeze",
|
||||
[PM_SUSPEND_STANDBY] = "standby",
|
||||
[PM_SUSPEND_MEM] = "mem",
|
||||
};
|
||||
|
||||
static const struct platform_suspend_ops *suspend_ops;
|
||||
|
||||
static bool need_suspend_ops(suspend_state_t state)
|
||||
{
|
||||
return !!(state > PM_SUSPEND_FREEZE);
|
||||
}
|
||||
|
||||
static DECLARE_WAIT_QUEUE_HEAD(suspend_freeze_wait_head);
|
||||
static bool suspend_freeze_wake;
|
||||
|
||||
static void freeze_begin(void)
|
||||
{
|
||||
suspend_freeze_wake = false;
|
||||
}
|
||||
|
||||
static void freeze_enter(void)
|
||||
{
|
||||
wait_event(suspend_freeze_wait_head, suspend_freeze_wake);
|
||||
}
|
||||
|
||||
void freeze_wake(void)
|
||||
{
|
||||
suspend_freeze_wake = true;
|
||||
wake_up(&suspend_freeze_wait_head);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(freeze_wake);
|
||||
|
||||
/**
|
||||
* suspend_set_ops - Set the global suspend method table.
|
||||
* @ops: Suspend operations to use.
|
||||
@@ -50,8 +76,11 @@ EXPORT_SYMBOL_GPL(suspend_set_ops);
|
||||
|
||||
bool valid_state(suspend_state_t state)
|
||||
{
|
||||
if (state == PM_SUSPEND_FREEZE)
|
||||
return true;
|
||||
/*
|
||||
* All states need lowlevel support and need to be valid to the lowlevel
|
||||
* PM_SUSPEND_STANDBY and PM_SUSPEND_MEMORY states need lowlevel
|
||||
* support and need to be valid to the lowlevel
|
||||
* implementation, no valid callback implies that none are valid.
|
||||
*/
|
||||
return suspend_ops && suspend_ops->valid && suspend_ops->valid(state);
|
||||
@@ -89,11 +118,11 @@ static int suspend_test(int level)
|
||||
* hibernation). Run suspend notifiers, allocate the "suspend" console and
|
||||
* freeze processes.
|
||||
*/
|
||||
static int suspend_prepare(void)
|
||||
static int suspend_prepare(suspend_state_t state)
|
||||
{
|
||||
int error;
|
||||
|
||||
if (!suspend_ops || !suspend_ops->enter)
|
||||
if (need_suspend_ops(state) && (!suspend_ops || !suspend_ops->enter))
|
||||
return -EPERM;
|
||||
|
||||
pm_prepare_console();
|
||||
@@ -137,7 +166,7 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
|
||||
{
|
||||
int error;
|
||||
|
||||
if (suspend_ops->prepare) {
|
||||
if (need_suspend_ops(state) && suspend_ops->prepare) {
|
||||
error = suspend_ops->prepare();
|
||||
if (error)
|
||||
goto Platform_finish;
|
||||
@@ -149,12 +178,23 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
|
||||
goto Platform_finish;
|
||||
}
|
||||
|
||||
if (suspend_ops->prepare_late) {
|
||||
if (need_suspend_ops(state) && suspend_ops->prepare_late) {
|
||||
error = suspend_ops->prepare_late();
|
||||
if (error)
|
||||
goto Platform_wake;
|
||||
}
|
||||
|
||||
/*
|
||||
* PM_SUSPEND_FREEZE equals
|
||||
* frozen processes + suspended devices + idle processors.
|
||||
* Thus we should invoke freeze_enter() soon after
|
||||
* all the devices are suspended.
|
||||
*/
|
||||
if (state == PM_SUSPEND_FREEZE) {
|
||||
freeze_enter();
|
||||
goto Platform_wake;
|
||||
}
|
||||
|
||||
if (suspend_test(TEST_PLATFORM))
|
||||
goto Platform_wake;
|
||||
|
||||
@@ -182,13 +222,13 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
|
||||
enable_nonboot_cpus();
|
||||
|
||||
Platform_wake:
|
||||
if (suspend_ops->wake)
|
||||
if (need_suspend_ops(state) && suspend_ops->wake)
|
||||
suspend_ops->wake();
|
||||
|
||||
dpm_resume_start(PMSG_RESUME);
|
||||
|
||||
Platform_finish:
|
||||
if (suspend_ops->finish)
|
||||
if (need_suspend_ops(state) && suspend_ops->finish)
|
||||
suspend_ops->finish();
|
||||
|
||||
return error;
|
||||
@@ -203,11 +243,11 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||
int error;
|
||||
bool wakeup = false;
|
||||
|
||||
if (!suspend_ops)
|
||||
if (need_suspend_ops(state) && !suspend_ops)
|
||||
return -ENOSYS;
|
||||
|
||||
trace_machine_suspend(state);
|
||||
if (suspend_ops->begin) {
|
||||
if (need_suspend_ops(state) && suspend_ops->begin) {
|
||||
error = suspend_ops->begin(state);
|
||||
if (error)
|
||||
goto Close;
|
||||
@@ -226,7 +266,7 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||
|
||||
do {
|
||||
error = suspend_enter(state, &wakeup);
|
||||
} while (!error && !wakeup
|
||||
} while (!error && !wakeup && need_suspend_ops(state)
|
||||
&& suspend_ops->suspend_again && suspend_ops->suspend_again());
|
||||
|
||||
Resume_devices:
|
||||
@@ -236,13 +276,13 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||
ftrace_start();
|
||||
resume_console();
|
||||
Close:
|
||||
if (suspend_ops->end)
|
||||
if (need_suspend_ops(state) && suspend_ops->end)
|
||||
suspend_ops->end();
|
||||
trace_machine_suspend(PWR_EVENT_EXIT);
|
||||
return error;
|
||||
|
||||
Recover_platform:
|
||||
if (suspend_ops->recover)
|
||||
if (need_suspend_ops(state) && suspend_ops->recover)
|
||||
suspend_ops->recover();
|
||||
goto Resume_devices;
|
||||
}
|
||||
@@ -278,12 +318,15 @@ static int enter_state(suspend_state_t state)
|
||||
if (!mutex_trylock(&pm_mutex))
|
||||
return -EBUSY;
|
||||
|
||||
if (state == PM_SUSPEND_FREEZE)
|
||||
freeze_begin();
|
||||
|
||||
printk(KERN_INFO "PM: Syncing filesystems ... ");
|
||||
sys_sync();
|
||||
printk("done.\n");
|
||||
|
||||
pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]);
|
||||
error = suspend_prepare();
|
||||
error = suspend_prepare(state);
|
||||
if (error)
|
||||
goto Unlock;
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ static void __init test_wakealarm(struct rtc_device *rtc, suspend_state_t state)
|
||||
rtc_set_alarm(rtc, &alm);
|
||||
}
|
||||
|
||||
static int __init has_wakealarm(struct device *dev, void *name_ptr)
|
||||
static int __init has_wakealarm(struct device *dev, const void *data)
|
||||
{
|
||||
struct rtc_device *candidate = to_rtc_device(dev);
|
||||
|
||||
@@ -121,7 +121,6 @@ static int __init has_wakealarm(struct device *dev, void *name_ptr)
|
||||
if (!device_may_wakeup(candidate->dev.parent))
|
||||
return 0;
|
||||
|
||||
*(const char **)name_ptr = dev_name(dev);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -159,8 +158,8 @@ static int __init test_suspend(void)
|
||||
static char warn_no_rtc[] __initdata =
|
||||
KERN_WARNING "PM: no wakealarm-capable RTC driver is ready\n";
|
||||
|
||||
char *pony = NULL;
|
||||
struct rtc_device *rtc = NULL;
|
||||
struct device *dev;
|
||||
|
||||
/* PM is initialized by now; is that state testable? */
|
||||
if (test_state == PM_SUSPEND_ON)
|
||||
@@ -171,9 +170,9 @@ static int __init test_suspend(void)
|
||||
}
|
||||
|
||||
/* RTCs have initialized by now too ... can we use one? */
|
||||
class_find_device(rtc_class, NULL, &pony, has_wakealarm);
|
||||
if (pony)
|
||||
rtc = rtc_class_open(pony);
|
||||
dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm);
|
||||
if (dev)
|
||||
rtc = rtc_class_open(dev_name(dev));
|
||||
if (!rtc) {
|
||||
printk(warn_no_rtc);
|
||||
goto done;
|
||||
|
||||
Reference in New Issue
Block a user