2013-09-28 18:18:21

by Ronald

[permalink] [raw]
Subject: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

[ resend, forgot to disable HTML (sorry!) ]

Dear kernel developers,

Commit 8fd37a4c9 (PM / hibernate: Create memory bitmaps after freezing
user space) causes resume to fail.

Only, when using the s2disk utility (through pm-hibernate).

Not when I do:

echo -n "disk" > /sys/power/state

Reverting the commit did not work.

I am using a encrypted LUKS partition with a temporary key that is
functioning as the swap device used for the suspend image.

Awaiting further orders....

Ronald


2013-09-29 01:05:18

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

On Saturday, September 28, 2013 08:18:18 PM Ronald wrote:
> [ resend, forgot to disable HTML (sorry!) ]
>
> Dear kernel developers,
>
> Commit 8fd37a4c9 (PM / hibernate: Create memory bitmaps after freezing
> user space) causes resume to fail.
>
> Only, when using the s2disk utility (through pm-hibernate).
>
> Not when I do:
>
> echo -n "disk" > /sys/power/state
>
> Reverting the commit did not work.
>
> I am using a encrypted LUKS partition with a temporary key that is
> functioning as the swap device used for the suspend image.
>
> Awaiting further orders....

I'm traveling now, so I can't really test things, but I think I know what the
problem is.

Can you please check if the appended patch makes any difference for you?

Rafael


---
kernel/power/snapshot.c | 5 ++++-
kernel/power/user.c | 5 +++++
2 files changed, 9 insertions(+), 1 deletion(-)

Index: linux-pm/kernel/power/snapshot.c
===================================================================
--- linux-pm.orig/kernel/power/snapshot.c
+++ linux-pm/kernel/power/snapshot.c
@@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
struct memory_bitmap *bm1, *bm2;
int error = 0;

- BUG_ON(forbidden_pages_map || free_pages_map);
+ if (forbidden_pages_map && free_pages_map)
+ return 0;
+ else
+ BUG_ON(forbidden_pages_map || free_pages_map);

bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
if (!bm1)
Index: linux-pm/kernel/power/user.c
===================================================================
--- linux-pm.orig/kernel/power/user.c
+++ linux-pm/kernel/power/user.c
@@ -82,6 +82,9 @@ static int snapshot_open(struct inode *i
data->swap = -1;
data->mode = O_WRONLY;
error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
+ if (!error)
+ error = create_basic_memory_bitmaps();
+
if (error)
pm_notifier_call_chain(PM_POST_RESTORE);
}

2013-09-29 07:22:50

by Ronald

[permalink] [raw]
Subject: Re: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

Attached patch fixes the issue. Both methods function as they did
before. Thanks for the superfast fix!

2013/9/29 Rafael J. Wysocki <[email protected]>:
> On Saturday, September 28, 2013 08:18:18 PM Ronald wrote:
>> [ resend, forgot to disable HTML (sorry!) ]
>>
>> Dear kernel developers,
>>
>> Commit 8fd37a4c9 (PM / hibernate: Create memory bitmaps after freezing
>> user space) causes resume to fail.
>>
>> Only, when using the s2disk utility (through pm-hibernate).
>>
>> Not when I do:
>>
>> echo -n "disk" > /sys/power/state
>>
>> Reverting the commit did not work.
>>
>> I am using a encrypted LUKS partition with a temporary key that is
>> functioning as the swap device used for the suspend image.
>>
>> Awaiting further orders....
>
> I'm traveling now, so I can't really test things, but I think I know what the
> problem is.
>
> Can you please check if the appended patch makes any difference for you?
>
> Rafael
>
>
> ---
> kernel/power/snapshot.c | 5 ++++-
> kernel/power/user.c | 5 +++++
> 2 files changed, 9 insertions(+), 1 deletion(-)
>
> Index: linux-pm/kernel/power/snapshot.c
> ===================================================================
> --- linux-pm.orig/kernel/power/snapshot.c
> +++ linux-pm/kernel/power/snapshot.c
> @@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
> struct memory_bitmap *bm1, *bm2;
> int error = 0;
>
> - BUG_ON(forbidden_pages_map || free_pages_map);
> + if (forbidden_pages_map && free_pages_map)
> + return 0;
> + else
> + BUG_ON(forbidden_pages_map || free_pages_map);
>
> bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
> if (!bm1)
> Index: linux-pm/kernel/power/user.c
> ===================================================================
> --- linux-pm.orig/kernel/power/user.c
> +++ linux-pm/kernel/power/user.c
> @@ -82,6 +82,9 @@ static int snapshot_open(struct inode *i
> data->swap = -1;
> data->mode = O_WRONLY;
> error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
> + if (!error)
> + error = create_basic_memory_bitmaps();
> +
> if (error)
> pm_notifier_call_chain(PM_POST_RESTORE);
> }
>

2013-09-30 00:01:25

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

On Sunday, September 29, 2013 09:22:45 AM Ronald wrote:
> Attached patch fixes the issue. Both methods function as they did
> before. Thanks for the superfast fix!

You're welcome, it's not the final one, however.

Can you please test the one below and report back?

Rafael


---
kernel/power/snapshot.c | 5 ++++-
kernel/power/user.c | 8 ++++++++
2 files changed, 12 insertions(+), 1 deletion(-)

Index: linux-pm/kernel/power/snapshot.c
===================================================================
--- linux-pm.orig/kernel/power/snapshot.c
+++ linux-pm/kernel/power/snapshot.c
@@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
struct memory_bitmap *bm1, *bm2;
int error = 0;

- BUG_ON(forbidden_pages_map || free_pages_map);
+ if (forbidden_pages_map && free_pages_map)
+ return 0;
+ else
+ BUG_ON(forbidden_pages_map || free_pages_map);

bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
if (!bm1)
Index: linux-pm/kernel/power/user.c
===================================================================
--- linux-pm.orig/kernel/power/user.c
+++ linux-pm/kernel/power/user.c
@@ -39,6 +39,7 @@ static struct snapshot_data {
char frozen;
char ready;
char platform_support;
+ bool free_bitmaps;
} snapshot_state;

atomic_t snapshot_device_available = ATOMIC_INIT(1);
@@ -82,6 +83,10 @@ static int snapshot_open(struct inode *i
data->swap = -1;
data->mode = O_WRONLY;
error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
+ if (!error) {
+ error = create_basic_memory_bitmaps();
+ data->free_bitmaps = !error;
+ }
if (error)
pm_notifier_call_chain(PM_POST_RESTORE);
}
@@ -111,6 +116,8 @@ static int snapshot_release(struct inode
pm_restore_gfp_mask();
free_basic_memory_bitmaps();
thaw_processes();
+ } else if (data->free_bitmaps) {
+ free_basic_memory_bitmaps();
}
pm_notifier_call_chain(data->mode == O_RDONLY ?
PM_POST_HIBERNATION : PM_POST_RESTORE);
@@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *
break;
pm_restore_gfp_mask();
free_basic_memory_bitmaps();
+ data->free_bitmaps = false;
thaw_processes();
data->frozen = 0;
break;

2013-09-30 05:46:00

by Ronald

[permalink] [raw]
Subject: Re: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

Yes, works as well. Just survived twe cycles with s2disk. I'm
surprised someone else did not report this earlier btw... Because it
looks pretty generic (i.e. not specific to a 64bit UP system).

Thanks again!

2013/9/30 Rafael J. Wysocki <[email protected]>:
> On Sunday, September 29, 2013 09:22:45 AM Ronald wrote:
>> Attached patch fixes the issue. Both methods function as they did
>> before. Thanks for the superfast fix!
>
> You're welcome, it's not the final one, however.
>
> Can you please test the one below and report back?
>
> Rafael
>
>
> ---
> kernel/power/snapshot.c | 5 ++++-
> kernel/power/user.c | 8 ++++++++
> 2 files changed, 12 insertions(+), 1 deletion(-)
>
> Index: linux-pm/kernel/power/snapshot.c
> ===================================================================
> --- linux-pm.orig/kernel/power/snapshot.c
> +++ linux-pm/kernel/power/snapshot.c
> @@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
> struct memory_bitmap *bm1, *bm2;
> int error = 0;
>
> - BUG_ON(forbidden_pages_map || free_pages_map);
> + if (forbidden_pages_map && free_pages_map)
> + return 0;
> + else
> + BUG_ON(forbidden_pages_map || free_pages_map);
>
> bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
> if (!bm1)
> Index: linux-pm/kernel/power/user.c
> ===================================================================
> --- linux-pm.orig/kernel/power/user.c
> +++ linux-pm/kernel/power/user.c
> @@ -39,6 +39,7 @@ static struct snapshot_data {
> char frozen;
> char ready;
> char platform_support;
> + bool free_bitmaps;
> } snapshot_state;
>
> atomic_t snapshot_device_available = ATOMIC_INIT(1);
> @@ -82,6 +83,10 @@ static int snapshot_open(struct inode *i
> data->swap = -1;
> data->mode = O_WRONLY;
> error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
> + if (!error) {
> + error = create_basic_memory_bitmaps();
> + data->free_bitmaps = !error;
> + }
> if (error)
> pm_notifier_call_chain(PM_POST_RESTORE);
> }
> @@ -111,6 +116,8 @@ static int snapshot_release(struct inode
> pm_restore_gfp_mask();
> free_basic_memory_bitmaps();
> thaw_processes();
> + } else if (data->free_bitmaps) {
> + free_basic_memory_bitmaps();
> }
> pm_notifier_call_chain(data->mode == O_RDONLY ?
> PM_POST_HIBERNATION : PM_POST_RESTORE);
> @@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *
> break;
> pm_restore_gfp_mask();
> free_basic_memory_bitmaps();
> + data->free_bitmaps = false;
> thaw_processes();
> data->frozen = 0;
> break;
>

2013-09-30 17:03:48

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

On Monday, September 30, 2013 07:45:54 AM Ronald wrote:
> Yes, works as well. Just survived twe cycles with s2disk. I'm
> surprised someone else did not report this earlier btw... Because it
> looks pretty generic (i.e. not specific to a 64bit UP system).

It is a generic bug, actually. Well, this means the user space driven
hibernation doesn't receive much testing coverage these days ...

I'll resend the patch with a proper changelog and then push it for v3.12-rc4.

Thanks,
Rafael


> 2013/9/30 Rafael J. Wysocki <[email protected]>:
> > On Sunday, September 29, 2013 09:22:45 AM Ronald wrote:
> >> Attached patch fixes the issue. Both methods function as they did
> >> before. Thanks for the superfast fix!
> >
> > You're welcome, it's not the final one, however.
> >
> > Can you please test the one below and report back?
> >
> > Rafael
> >
> >
> > ---
> > kernel/power/snapshot.c | 5 ++++-
> > kernel/power/user.c | 8 ++++++++
> > 2 files changed, 12 insertions(+), 1 deletion(-)
> >
> > Index: linux-pm/kernel/power/snapshot.c
> > ===================================================================
> > --- linux-pm.orig/kernel/power/snapshot.c
> > +++ linux-pm/kernel/power/snapshot.c
> > @@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
> > struct memory_bitmap *bm1, *bm2;
> > int error = 0;
> >
> > - BUG_ON(forbidden_pages_map || free_pages_map);
> > + if (forbidden_pages_map && free_pages_map)
> > + return 0;
> > + else
> > + BUG_ON(forbidden_pages_map || free_pages_map);
> >
> > bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
> > if (!bm1)
> > Index: linux-pm/kernel/power/user.c
> > ===================================================================
> > --- linux-pm.orig/kernel/power/user.c
> > +++ linux-pm/kernel/power/user.c
> > @@ -39,6 +39,7 @@ static struct snapshot_data {
> > char frozen;
> > char ready;
> > char platform_support;
> > + bool free_bitmaps;
> > } snapshot_state;
> >
> > atomic_t snapshot_device_available = ATOMIC_INIT(1);
> > @@ -82,6 +83,10 @@ static int snapshot_open(struct inode *i
> > data->swap = -1;
> > data->mode = O_WRONLY;
> > error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
> > + if (!error) {
> > + error = create_basic_memory_bitmaps();
> > + data->free_bitmaps = !error;
> > + }
> > if (error)
> > pm_notifier_call_chain(PM_POST_RESTORE);
> > }
> > @@ -111,6 +116,8 @@ static int snapshot_release(struct inode
> > pm_restore_gfp_mask();
> > free_basic_memory_bitmaps();
> > thaw_processes();
> > + } else if (data->free_bitmaps) {
> > + free_basic_memory_bitmaps();
> > }
> > pm_notifier_call_chain(data->mode == O_RDONLY ?
> > PM_POST_HIBERNATION : PM_POST_RESTORE);
> > @@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *
> > break;
> > pm_restore_gfp_mask();
> > free_basic_memory_bitmaps();
> > + data->free_bitmaps = false;
> > thaw_processes();
> > data->frozen = 0;
> > break;
> >
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

2013-09-30 17:25:41

by Rafael J. Wysocki

[permalink] [raw]
Subject: [PATCH] PM / hibernate: Fix user space driven resume regression

From: Rafael J. Wysocki <[email protected]>

Recent commit 8fd37a4 (PM / hibernate: Create memory bitmaps after
freezing user space) broke the resume part of the user space driven
hibernation (s2disk), because I forgot that the resume utility
loaded the image into memory without freezing user space (it still
freezes tasks after loading the image). This means that during user
space driven resume we need to create the memory bitmaps at the
"device open" time rather than at the "freeze tasks" time, so make
that happen (that's a special case anyway, so it needs to be treated
in a special way).

Reported-and-tested-by: Ronald <[email protected]>
Signed-off-by: Rafael J. Wysocki <[email protected]>
---
kernel/power/snapshot.c | 5 ++++-
kernel/power/user.c | 8 ++++++++
2 files changed, 12 insertions(+), 1 deletion(-)

Index: linux-pm/kernel/power/snapshot.c
===================================================================
--- linux-pm.orig/kernel/power/snapshot.c
+++ linux-pm/kernel/power/snapshot.c
@@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
struct memory_bitmap *bm1, *bm2;
int error = 0;

- BUG_ON(forbidden_pages_map || free_pages_map);
+ if (forbidden_pages_map && free_pages_map)
+ return 0;
+ else
+ BUG_ON(forbidden_pages_map || free_pages_map);

bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
if (!bm1)
Index: linux-pm/kernel/power/user.c
===================================================================
--- linux-pm.orig/kernel/power/user.c
+++ linux-pm/kernel/power/user.c
@@ -39,6 +39,7 @@ static struct snapshot_data {
char frozen;
char ready;
char platform_support;
+ bool free_bitmaps;
} snapshot_state;

atomic_t snapshot_device_available = ATOMIC_INIT(1);
@@ -82,6 +83,10 @@ static int snapshot_open(struct inode *i
data->swap = -1;
data->mode = O_WRONLY;
error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
+ if (!error) {
+ error = create_basic_memory_bitmaps();
+ data->free_bitmaps = !error;
+ }
if (error)
pm_notifier_call_chain(PM_POST_RESTORE);
}
@@ -111,6 +116,8 @@ static int snapshot_release(struct inode
pm_restore_gfp_mask();
free_basic_memory_bitmaps();
thaw_processes();
+ } else if (data->free_bitmaps) {
+ free_basic_memory_bitmaps();
}
pm_notifier_call_chain(data->mode == O_RDONLY ?
PM_POST_HIBERNATION : PM_POST_RESTORE);
@@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *
break;
pm_restore_gfp_mask();
free_basic_memory_bitmaps();
+ data->free_bitmaps = false;
thaw_processes();
data->frozen = 0;
break;

2013-10-01 16:38:08

by Ronald

[permalink] [raw]
Subject: Re: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

This could be a coincidence, but I had a disk data corruption in /var
(LVM). Most other partitions are read-only during normal operation. So
I can safely keep testing this kernel. Just mentioning this, in case
you see this happening with other ppl testing this patch as well.

2013/9/30 Rafael J. Wysocki <[email protected]>:
> On Monday, September 30, 2013 07:45:54 AM Ronald wrote:
>> Yes, works as well. Just survived twe cycles with s2disk. I'm
>> surprised someone else did not report this earlier btw... Because it
>> looks pretty generic (i.e. not specific to a 64bit UP system).
>
> It is a generic bug, actually. Well, this means the user space driven
> hibernation doesn't receive much testing coverage these days ...
>
> I'll resend the patch with a proper changelog and then push it for v3.12-rc4.
>
> Thanks,
> Rafael
>
>
>> 2013/9/30 Rafael J. Wysocki <[email protected]>:
>> > On Sunday, September 29, 2013 09:22:45 AM Ronald wrote:
>> >> Attached patch fixes the issue. Both methods function as they did
>> >> before. Thanks for the superfast fix!
>> >
>> > You're welcome, it's not the final one, however.
>> >
>> > Can you please test the one below and report back?
>> >
>> > Rafael
>> >
>> >
>> > ---
>> > kernel/power/snapshot.c | 5 ++++-
>> > kernel/power/user.c | 8 ++++++++
>> > 2 files changed, 12 insertions(+), 1 deletion(-)
>> >
>> > Index: linux-pm/kernel/power/snapshot.c
>> > ===================================================================
>> > --- linux-pm.orig/kernel/power/snapshot.c
>> > +++ linux-pm/kernel/power/snapshot.c
>> > @@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
>> > struct memory_bitmap *bm1, *bm2;
>> > int error = 0;
>> >
>> > - BUG_ON(forbidden_pages_map || free_pages_map);
>> > + if (forbidden_pages_map && free_pages_map)
>> > + return 0;
>> > + else
>> > + BUG_ON(forbidden_pages_map || free_pages_map);
>> >
>> > bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
>> > if (!bm1)
>> > Index: linux-pm/kernel/power/user.c
>> > ===================================================================
>> > --- linux-pm.orig/kernel/power/user.c
>> > +++ linux-pm/kernel/power/user.c
>> > @@ -39,6 +39,7 @@ static struct snapshot_data {
>> > char frozen;
>> > char ready;
>> > char platform_support;
>> > + bool free_bitmaps;
>> > } snapshot_state;
>> >
>> > atomic_t snapshot_device_available = ATOMIC_INIT(1);
>> > @@ -82,6 +83,10 @@ static int snapshot_open(struct inode *i
>> > data->swap = -1;
>> > data->mode = O_WRONLY;
>> > error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
>> > + if (!error) {
>> > + error = create_basic_memory_bitmaps();
>> > + data->free_bitmaps = !error;
>> > + }
>> > if (error)
>> > pm_notifier_call_chain(PM_POST_RESTORE);
>> > }
>> > @@ -111,6 +116,8 @@ static int snapshot_release(struct inode
>> > pm_restore_gfp_mask();
>> > free_basic_memory_bitmaps();
>> > thaw_processes();
>> > + } else if (data->free_bitmaps) {
>> > + free_basic_memory_bitmaps();
>> > }
>> > pm_notifier_call_chain(data->mode == O_RDONLY ?
>> > PM_POST_HIBERNATION : PM_POST_RESTORE);
>> > @@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *
>> > break;
>> > pm_restore_gfp_mask();
>> > free_basic_memory_bitmaps();
>> > + data->free_bitmaps = false;
>> > thaw_processes();
>> > data->frozen = 0;
>> > break;
>> >
> --
> I speak only for myself.
> Rafael J. Wysocki, Intel Open Source Technology Center.

2013-10-01 20:23:47

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: Fwd: [v3.12-rc1] [regression] PM / hibernate: Create memory bitmaps after freezing user space

On Tuesday, October 01, 2013 06:38:03 PM Ronald wrote:
> This could be a coincidence, but I had a disk data corruption in /var
> (LVM). Most other partitions are read-only during normal operation. So
> I can safely keep testing this kernel. Just mentioning this, in case
> you see this happening with other ppl testing this patch as well.

If you have a failing resume from hibernation a filesystem is perfectly
possible, unfortunately.

The patch itself should't really cause any corruption to happen.

Thanks,
Rafael


> 2013/9/30 Rafael J. Wysocki <[email protected]>:
> > On Monday, September 30, 2013 07:45:54 AM Ronald wrote:
> >> Yes, works as well. Just survived twe cycles with s2disk. I'm
> >> surprised someone else did not report this earlier btw... Because it
> >> looks pretty generic (i.e. not specific to a 64bit UP system).
> >
> > It is a generic bug, actually. Well, this means the user space driven
> > hibernation doesn't receive much testing coverage these days ...
> >
> > I'll resend the patch with a proper changelog and then push it for v3.12-rc4.
> >
> > Thanks,
> > Rafael
> >
> >
> >> 2013/9/30 Rafael J. Wysocki <[email protected]>:
> >> > On Sunday, September 29, 2013 09:22:45 AM Ronald wrote:
> >> >> Attached patch fixes the issue. Both methods function as they did
> >> >> before. Thanks for the superfast fix!
> >> >
> >> > You're welcome, it's not the final one, however.
> >> >
> >> > Can you please test the one below and report back?
> >> >
> >> > Rafael
> >> >
> >> >
> >> > ---
> >> > kernel/power/snapshot.c | 5 ++++-
> >> > kernel/power/user.c | 8 ++++++++
> >> > 2 files changed, 12 insertions(+), 1 deletion(-)
> >> >
> >> > Index: linux-pm/kernel/power/snapshot.c
> >> > ===================================================================
> >> > --- linux-pm.orig/kernel/power/snapshot.c
> >> > +++ linux-pm/kernel/power/snapshot.c
> >> > @@ -743,7 +743,10 @@ int create_basic_memory_bitmaps(void)
> >> > struct memory_bitmap *bm1, *bm2;
> >> > int error = 0;
> >> >
> >> > - BUG_ON(forbidden_pages_map || free_pages_map);
> >> > + if (forbidden_pages_map && free_pages_map)
> >> > + return 0;
> >> > + else
> >> > + BUG_ON(forbidden_pages_map || free_pages_map);
> >> >
> >> > bm1 = kzalloc(sizeof(struct memory_bitmap), GFP_KERNEL);
> >> > if (!bm1)
> >> > Index: linux-pm/kernel/power/user.c
> >> > ===================================================================
> >> > --- linux-pm.orig/kernel/power/user.c
> >> > +++ linux-pm/kernel/power/user.c
> >> > @@ -39,6 +39,7 @@ static struct snapshot_data {
> >> > char frozen;
> >> > char ready;
> >> > char platform_support;
> >> > + bool free_bitmaps;
> >> > } snapshot_state;
> >> >
> >> > atomic_t snapshot_device_available = ATOMIC_INIT(1);
> >> > @@ -82,6 +83,10 @@ static int snapshot_open(struct inode *i
> >> > data->swap = -1;
> >> > data->mode = O_WRONLY;
> >> > error = pm_notifier_call_chain(PM_RESTORE_PREPARE);
> >> > + if (!error) {
> >> > + error = create_basic_memory_bitmaps();
> >> > + data->free_bitmaps = !error;
> >> > + }
> >> > if (error)
> >> > pm_notifier_call_chain(PM_POST_RESTORE);
> >> > }
> >> > @@ -111,6 +116,8 @@ static int snapshot_release(struct inode
> >> > pm_restore_gfp_mask();
> >> > free_basic_memory_bitmaps();
> >> > thaw_processes();
> >> > + } else if (data->free_bitmaps) {
> >> > + free_basic_memory_bitmaps();
> >> > }
> >> > pm_notifier_call_chain(data->mode == O_RDONLY ?
> >> > PM_POST_HIBERNATION : PM_POST_RESTORE);
> >> > @@ -231,6 +238,7 @@ static long snapshot_ioctl(struct file *
> >> > break;
> >> > pm_restore_gfp_mask();
> >> > free_basic_memory_bitmaps();
> >> > + data->free_bitmaps = false;
> >> > thaw_processes();
> >> > data->frozen = 0;
> >> > break;
> >> >
> > --
> > I speak only for myself.
> > Rafael J. Wysocki, Intel Open Source Technology Center.
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.