Skip to content

Commit 38dc634

Browse files
committed
Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: PM: Remove some debug messages producing too much noise PM: Fix warning on suspend errors PM / Hibernate: Add newline to load_image() fail path PM / Hibernate: Fix error handling in save_image() PM / Hibernate: Fix blkdev refleaks PM / yenta: Split resume into early and late parts (rev. 4)
2 parents 1d51075 + 2ddac2a commit 38dc634

File tree

7 files changed

+89
-55
lines changed

7 files changed

+89
-55
lines changed

drivers/base/power/main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ static void dpm_complete(pm_message_t state)
511511

512512
INIT_LIST_HEAD(&list);
513513
mutex_lock(&dpm_list_mtx);
514+
transition_started = false;
514515
while (!list_empty(&dpm_list)) {
515516
struct device *dev = to_device(dpm_list.prev);
516517

drivers/base/power/runtime.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ static int __pm_runtime_idle(struct device *dev)
5151
{
5252
int retval = 0;
5353

54-
dev_dbg(dev, "__pm_runtime_idle()!\n");
55-
5654
if (dev->power.runtime_error)
5755
retval = -EINVAL;
5856
else if (dev->power.idle_notification)
@@ -93,8 +91,6 @@ static int __pm_runtime_idle(struct device *dev)
9391
wake_up_all(&dev->power.wait_queue);
9492

9593
out:
96-
dev_dbg(dev, "__pm_runtime_idle() returns %d!\n", retval);
97-
9894
return retval;
9995
}
10096

drivers/pcmcia/cs.c

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,13 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem);
9898
* These functions check for the appropriate struct pcmcia_soket arrays,
9999
* and pass them to the low-level functions pcmcia_{suspend,resume}_socket
100100
*/
101+
static int socket_early_resume(struct pcmcia_socket *skt);
102+
static int socket_late_resume(struct pcmcia_socket *skt);
101103
static int socket_resume(struct pcmcia_socket *skt);
102104
static int socket_suspend(struct pcmcia_socket *skt);
103105

104-
int pcmcia_socket_dev_suspend(struct device *dev)
106+
static void pcmcia_socket_dev_run(struct device *dev,
107+
int (*cb)(struct pcmcia_socket *))
105108
{
106109
struct pcmcia_socket *socket;
107110

@@ -110,29 +113,34 @@ int pcmcia_socket_dev_suspend(struct device *dev)
110113
if (socket->dev.parent != dev)
111114
continue;
112115
mutex_lock(&socket->skt_mutex);
113-
socket_suspend(socket);
116+
cb(socket);
114117
mutex_unlock(&socket->skt_mutex);
115118
}
116119
up_read(&pcmcia_socket_list_rwsem);
120+
}
117121

122+
int pcmcia_socket_dev_suspend(struct device *dev)
123+
{
124+
pcmcia_socket_dev_run(dev, socket_suspend);
118125
return 0;
119126
}
120127
EXPORT_SYMBOL(pcmcia_socket_dev_suspend);
121128

122-
int pcmcia_socket_dev_resume(struct device *dev)
129+
void pcmcia_socket_dev_early_resume(struct device *dev)
123130
{
124-
struct pcmcia_socket *socket;
131+
pcmcia_socket_dev_run(dev, socket_early_resume);
132+
}
133+
EXPORT_SYMBOL(pcmcia_socket_dev_early_resume);
125134

126-
down_read(&pcmcia_socket_list_rwsem);
127-
list_for_each_entry(socket, &pcmcia_socket_list, socket_list) {
128-
if (socket->dev.parent != dev)
129-
continue;
130-
mutex_lock(&socket->skt_mutex);
131-
socket_resume(socket);
132-
mutex_unlock(&socket->skt_mutex);
133-
}
134-
up_read(&pcmcia_socket_list_rwsem);
135+
void pcmcia_socket_dev_late_resume(struct device *dev)
136+
{
137+
pcmcia_socket_dev_run(dev, socket_late_resume);
138+
}
139+
EXPORT_SYMBOL(pcmcia_socket_dev_late_resume);
135140

141+
int pcmcia_socket_dev_resume(struct device *dev)
142+
{
143+
pcmcia_socket_dev_run(dev, socket_resume);
136144
return 0;
137145
}
138146
EXPORT_SYMBOL(pcmcia_socket_dev_resume);
@@ -546,29 +554,24 @@ static int socket_suspend(struct pcmcia_socket *skt)
546554
return 0;
547555
}
548556

549-
/*
550-
* Resume a socket. If a card is present, verify its CIS against
551-
* our cached copy. If they are different, the card has been
552-
* replaced, and we need to tell the drivers.
553-
*/
554-
static int socket_resume(struct pcmcia_socket *skt)
557+
static int socket_early_resume(struct pcmcia_socket *skt)
555558
{
556-
int ret;
557-
558-
if (!(skt->state & SOCKET_SUSPEND))
559-
return -EBUSY;
560-
561559
skt->socket = dead_socket;
562560
skt->ops->init(skt);
563561
skt->ops->set_socket(skt, &skt->socket);
562+
if (skt->state & SOCKET_PRESENT)
563+
skt->resume_status = socket_setup(skt, resume_delay);
564+
return 0;
565+
}
564566

567+
static int socket_late_resume(struct pcmcia_socket *skt)
568+
{
565569
if (!(skt->state & SOCKET_PRESENT)) {
566570
skt->state &= ~SOCKET_SUSPEND;
567571
return socket_insert(skt);
568572
}
569573

570-
ret = socket_setup(skt, resume_delay);
571-
if (ret == 0) {
574+
if (skt->resume_status == 0) {
572575
/*
573576
* FIXME: need a better check here for cardbus cards.
574577
*/
@@ -596,6 +599,20 @@ static int socket_resume(struct pcmcia_socket *skt)
596599
return 0;
597600
}
598601

602+
/*
603+
* Resume a socket. If a card is present, verify its CIS against
604+
* our cached copy. If they are different, the card has been
605+
* replaced, and we need to tell the drivers.
606+
*/
607+
static int socket_resume(struct pcmcia_socket *skt)
608+
{
609+
if (!(skt->state & SOCKET_SUSPEND))
610+
return -EBUSY;
611+
612+
socket_early_resume(skt);
613+
return socket_late_resume(skt);
614+
}
615+
599616
static void socket_remove(struct pcmcia_socket *skt)
600617
{
601618
dev_printk(KERN_NOTICE, &skt->dev,

drivers/pcmcia/yenta_socket.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1275,16 +1275,26 @@ static int yenta_dev_resume_noirq(struct device *dev)
12751275
if (socket->type && socket->type->restore_state)
12761276
socket->type->restore_state(socket);
12771277

1278-
return pcmcia_socket_dev_resume(dev);
1278+
pcmcia_socket_dev_early_resume(dev);
1279+
return 0;
1280+
}
1281+
1282+
static int yenta_dev_resume(struct device *dev)
1283+
{
1284+
pcmcia_socket_dev_late_resume(dev);
1285+
return 0;
12791286
}
12801287

12811288
static struct dev_pm_ops yenta_pm_ops = {
12821289
.suspend_noirq = yenta_dev_suspend_noirq,
12831290
.resume_noirq = yenta_dev_resume_noirq,
1291+
.resume = yenta_dev_resume,
12841292
.freeze_noirq = yenta_dev_suspend_noirq,
12851293
.thaw_noirq = yenta_dev_resume_noirq,
1294+
.thaw = yenta_dev_resume,
12861295
.poweroff_noirq = yenta_dev_suspend_noirq,
12871296
.restore_noirq = yenta_dev_resume_noirq,
1297+
.restore = yenta_dev_resume,
12881298
};
12891299

12901300
#define YENTA_PM_OPS (&yenta_pm_ops)

include/pcmcia/ss.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,8 @@ struct pcmcia_socket {
262262
struct device dev;
263263
/* data internal to the socket driver */
264264
void *driver_data;
265+
/* status of the card during resume from a system sleep state */
266+
int resume_status;
265267
};
266268

267269

@@ -280,6 +282,8 @@ extern struct pccard_resource_ops pccard_nonstatic_ops;
280282

281283
/* socket drivers are expected to use these callbacks in their .drv struct */
282284
extern int pcmcia_socket_dev_suspend(struct device *dev);
285+
extern void pcmcia_socket_dev_early_resume(struct device *dev);
286+
extern void pcmcia_socket_dev_late_resume(struct device *dev);
283287
extern int pcmcia_socket_dev_resume(struct device *dev);
284288

285289
/* socket drivers use this callback in their IRQ handler */

kernel/power/hibernate.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -693,21 +693,22 @@ static int software_resume(void)
693693
/* The snapshot device should not be opened while we're running */
694694
if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
695695
error = -EBUSY;
696+
swsusp_close(FMODE_READ);
696697
goto Unlock;
697698
}
698699

699700
pm_prepare_console();
700701
error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
701702
if (error)
702-
goto Finish;
703+
goto close_finish;
703704

704705
error = usermodehelper_disable();
705706
if (error)
706-
goto Finish;
707+
goto close_finish;
707708

708709
error = create_basic_memory_bitmaps();
709710
if (error)
710-
goto Finish;
711+
goto close_finish;
711712

712713
pr_debug("PM: Preparing processes for restore.\n");
713714
error = prepare_processes();
@@ -719,6 +720,7 @@ static int software_resume(void)
719720
pr_debug("PM: Reading hibernation image.\n");
720721

721722
error = swsusp_read(&flags);
723+
swsusp_close(FMODE_READ);
722724
if (!error)
723725
hibernation_restore(flags & SF_PLATFORM_MODE);
724726

@@ -737,6 +739,9 @@ static int software_resume(void)
737739
mutex_unlock(&pm_mutex);
738740
pr_debug("PM: Resume from disk failed.\n");
739741
return error;
742+
close_finish:
743+
swsusp_close(FMODE_READ);
744+
goto Finish;
740745
}
741746

742747
late_initcall(software_resume);

kernel/power/swap.c

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,6 @@ static int save_image(struct swap_map_handle *handle,
314314
{
315315
unsigned int m;
316316
int ret;
317-
int error = 0;
318317
int nr_pages;
319318
int err2;
320319
struct bio *bio;
@@ -329,26 +328,27 @@ static int save_image(struct swap_map_handle *handle,
329328
nr_pages = 0;
330329
bio = NULL;
331330
do_gettimeofday(&start);
332-
do {
331+
while (1) {
333332
ret = snapshot_read_next(snapshot, PAGE_SIZE);
334-
if (ret > 0) {
335-
error = swap_write_page(handle, data_of(*snapshot),
336-
&bio);
337-
if (error)
338-
break;
339-
if (!(nr_pages % m))
340-
printk("\b\b\b\b%3d%%", nr_pages / m);
341-
nr_pages++;
342-
}
343-
} while (ret > 0);
333+
if (ret <= 0)
334+
break;
335+
ret = swap_write_page(handle, data_of(*snapshot), &bio);
336+
if (ret)
337+
break;
338+
if (!(nr_pages % m))
339+
printk("\b\b\b\b%3d%%", nr_pages / m);
340+
nr_pages++;
341+
}
344342
err2 = wait_on_bio_chain(&bio);
345343
do_gettimeofday(&stop);
346-
if (!error)
347-
error = err2;
348-
if (!error)
344+
if (!ret)
345+
ret = err2;
346+
if (!ret)
349347
printk("\b\b\b\bdone\n");
348+
else
349+
printk("\n");
350350
swsusp_show_speed(&start, &stop, nr_to_write, "Wrote");
351-
return error;
351+
return ret;
352352
}
353353

354354
/**
@@ -536,7 +536,8 @@ static int load_image(struct swap_map_handle *handle,
536536
snapshot_write_finalize(snapshot);
537537
if (!snapshot_image_loaded(snapshot))
538538
error = -ENODATA;
539-
}
539+
} else
540+
printk("\n");
540541
swsusp_show_speed(&start, &stop, nr_to_read, "Read");
541542
return error;
542543
}
@@ -572,8 +573,6 @@ int swsusp_read(unsigned int *flags_p)
572573
error = load_image(&handle, &snapshot, header->pages - 1);
573574
release_swap_reader(&handle);
574575

575-
blkdev_put(resume_bdev, FMODE_READ);
576-
577576
if (!error)
578577
pr_debug("PM: Image successfully loaded\n");
579578
else
@@ -596,16 +595,18 @@ int swsusp_check(void)
596595
error = bio_read_page(swsusp_resume_block,
597596
swsusp_header, NULL);
598597
if (error)
599-
return error;
598+
goto put;
600599

601600
if (!memcmp(SWSUSP_SIG, swsusp_header->sig, 10)) {
602601
memcpy(swsusp_header->sig, swsusp_header->orig_sig, 10);
603602
/* Reset swap signature now */
604603
error = bio_write_page(swsusp_resume_block,
605604
swsusp_header, NULL);
606605
} else {
607-
return -EINVAL;
606+
error = -EINVAL;
608607
}
608+
609+
put:
609610
if (error)
610611
blkdev_put(resume_bdev, FMODE_READ);
611612
else

0 commit comments

Comments
 (0)