2006-12-03 12:26:07

by Andrey Borzenkov

[permalink] [raw]
Subject: 2.6.19: ACPI reports AC not present after resume from STD

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I started to notice it some time ago; I can't say exactly if this was not
present in earlier versions because recently I switched from STR (which gave
me no end of troubles) to STD. So I may have not seen it before.

Suspend to disk while on battery. Plug in AC, resume. ACPI continues to show
AC adapter as not present:

{pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
state: off-line

replugging AC correctly changes state to on-line.

The system is Toshiba Portege 4000; I am not sure which information may be
required in this case so please tell what is needed (unfortunately I will be
off next two weeks without access to this system).

regards

- -andrey
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)

iD8DBQFFcsJYR6LMutpd94wRAqSeAJ4n3lHqbdvgBeXxeIc9ZUTDe/X2jgCgyfU5
w+heEYYnA3Al/U9xHovOkQ4=
=F+Zu
-----END PGP SIGNATURE-----


2006-12-03 13:11:46

by Pavel Machek

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

Hi!

> I started to notice it some time ago; I can't say exactly if this was not
> present in earlier versions because recently I switched from STR (which gave
> me no end of troubles) to STD. So I may have not seen it before.
>
> Suspend to disk while on battery. Plug in AC, resume. ACPI continues to show
> AC adapter as not present:
>
> {pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
> state: off-line
>
> replugging AC correctly changes state to on-line.

try echo platform > /sys/power/disk.
Pavel
--
Thanks for all the (sleeping) penguins.

2006-12-03 13:52:42

by Andrey Borzenkov

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sunday 03 December 2006 16:11, Pavel Machek wrote:
> Hi!
>
> > I started to notice it some time ago; I can't say exactly if this was not
> > present in earlier versions because recently I switched from STR (which
> > gave me no end of troubles) to STD. So I may have not seen it before.
> >
> > Suspend to disk while on battery. Plug in AC, resume. ACPI continues to
> > show AC adapter as not present:
> >
> > {pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
> > state: off-line
> >
> > replugging AC correctly changes state to on-line.
>
> try echo platform > /sys/power/disk.

Nope.

{pts/0}% pmsuspend disk
... after resume
{pts/0}% cat /sys/power/disk
platform
{pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
state: off-line
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)

iD8DBQFFctamR6LMutpd94wRAqnCAJwKi4wXUj2FRkD2tyq+c0gqAghnrgCgyKYZ
lep/19gowY3OTGIkpzcasfU=
=4Cgb
-----END PGP SIGNATURE-----

2006-12-03 14:35:45

by Alexey Starikovskiy

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

Andrey Borzenkov wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> On Sunday 03 December 2006 16:11, Pavel Machek wrote:
>
>> Hi!
>>
>>
>>> I started to notice it some time ago; I can't say exactly if this was not
>>> present in earlier versions because recently I switched from STR (which
>>> gave me no end of troubles) to STD. So I may have not seen it before.
>>>
>>> Suspend to disk while on battery. Plug in AC, resume. ACPI continues to
>>> show AC adapter as not present:
>>>
>>> {pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
>>> state: off-line
>>>
>>> replugging AC correctly changes state to on-line.
>>>
>> try echo platform > /sys/power/disk.
>>
>
> Nope.
>
> {pts/0}% pmsuspend disk
> ... after resume
> {pts/0}% cat /sys/power/disk
> platform
> {pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
> state: off-line
>
please look if patches in 7122 work for you.

2006-12-03 16:01:00

by Andrey Borzenkov

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Sunday 03 December 2006 17:35, Alexey Starikovskiy wrote:
> Andrey Borzenkov wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > On Sunday 03 December 2006 16:11, Pavel Machek wrote:
> >> Hi!
> >>
> >>> I started to notice it some time ago; I can't say exactly if this was
> >>> not present in earlier versions because recently I switched from STR
> >>> (which gave me no end of troubles) to STD. So I may have not seen it
> >>> before.
> >>>
> >>> Suspend to disk while on battery. Plug in AC, resume. ACPI continues to
> >>> show AC adapter as not present:
> >>>
> >>> {pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
> >>> state: off-line
> >>>
> >>> replugging AC correctly changes state to on-line.
> >>
> >> try echo platform > /sys/power/disk.
> >
> > Nope.
> >
> > {pts/0}% pmsuspend disk
> > ... after resume
> > {pts/0}% cat /sys/power/disk
> > platform
> > {pts/0}% cat /proc/acpi/ac_adapter/ADP1/state
> > state: off-line
>
> please look if patches in 7122 work for you.

No. I applied patches from comments 38 and 52 (modified, it did not apply
cleanly to 2.6.19). As far as I understood, those two were final.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)

iD8DBQFFcvS3R6LMutpd94wRAp9oAKCM7+6G4SsgFEGLgkW1jxM3VMQHqQCdFSDQ
14w+QsgDtxWusmfdzCMOdqo=
=QDyt
-----END PGP SIGNATURE-----

2007-02-24 19:53:10

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

Hi,

On Saturday, 24 February 2007 10:55, Andrey Borzenkov wrote:
> On Вторник 13 февраля 2007, Andrey Borzenkov wrote:
> > On Четверг 07 декабря 2006, Lebedev, Vladimir P wrote:
> > > Please register new bug, attach acpidump and dmesg.
> >
> > http://bugzilla.kernel.org/show_bug.cgi?id=7995
> >
> > regards
> >
>
> Well, this starts looking like ACPI is not at fault.
>
> When reporting AC state ACPI just reads contents of system memory (I presume
> it gets updated by BIOS/ACPI when AC state changes). It looks like this
> memory area is restored during resume from STD. I updated mentioned bug
> report with more detailed description. Now if someone could suggest a way to
> catch if specific physical address gets saved/restored this would finally
> explain it.

First, if you want the reserved memory areas to be left alone by swsusp,
you need to mark them as 'nosave'. On x86_64 this is done by the function
e820_mark_nosave_range() in arch/x86_64/kernel/e820.c that can be ported to
i386 with no problems. However, we haven't found that very useful, so far,
since no one has ever reported any problems with the current approach,
which is to save and restore them.

Second, if you want to know if a suspicious page frame is saved by swsusp,
it's best to stick a test and a printk in kernel/power/pack_pfns() and
artificially fail the suspend, eg. by making swsusp_write() always return
an error.

> Gratefully waiting for patches to test :)

Sorry, no patches this time. I have more urgent problem to fix. :-)

Greetings,
Rafael


> > > -----Original Message-----
> > > From: Alexey Starikovskiy [mailto:[email protected]]
> > >
> > > Sent: Thursday, December 07, 2006 10:49 PM
> > > To: Rafael J. Wysocki
> > > Cc: Karasyov, Konstantin A; Andrey Borzenkov;
> > > [email protected]; Lebedev, Vladimir P
> > > Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD
> > >
> > > Rafael J. Wysocki wrote:
> > > > Hi,
> > > >
> > > > On Thursday, 7 December 2006 19:57, Karasyov, Konstantin A wrote:
> > > >> Hi,
> > > >>
> > > >> Unfortunately, I cannot reproduce this bug on my system, but the
> > >
> > > problem
> > >
> > > >> could be solved by adding a resume handler for AC adapter device.
> > >
> > > Could
> > >
> > > >> you try the attached patch to see if it helps.
> > > >
> > > > I can reproduce it and the patch doesn't help.
> > > >
> > > > Greetings,
> > > > Rafael
> > >
> > > Any ACPI errors in dmesg?
> > >
> > > Regards,
> > > Alex.
>
>
>
>

--
If you don't have the time to read,
you don't have the time or the tools to write.
- Stephen King

2007-02-24 23:26:40

by Andrey Borzenkov

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

On Суббота 24 февраля 2007, Rafael J. Wysocki wrote:
> Hi,
>
> On Saturday, 24 February 2007 10:55, Andrey Borzenkov wrote:
> > On Вторник 13 февраля 2007, Andrey Borzenkov wrote:
> > > On Четверг 07 декабря 2006, Lebedev, Vladimir P wrote:
> > > > Please register new bug, attach acpidump and dmesg.
> > >
> > > http://bugzilla.kernel.org/show_bug.cgi?id=7995
> > >
> > > regards
> >
> > Well, this starts looking like ACPI is not at fault.
> >
> > When reporting AC state ACPI just reads contents of system memory (I
> > presume it gets updated by BIOS/ACPI when AC state changes). It looks
> > like this memory area is restored during resume from STD. I updated
> > mentioned bug report with more detailed description. Now if someone could
> > suggest a way to catch if specific physical address gets saved/restored
> > this would finally explain it.
>
> First, if you want the reserved memory areas to be left alone by swsusp,
> you need to mark them as 'nosave'. On x86_64 this is done by the function
> e820_mark_nosave_range() in arch/x86_64/kernel/e820.c that can be ported to
> i386 with no problems. However, we haven't found that very useful, so far,
> since no one has ever reported any problems with the current approach,
> which is to save and restore them.
>

Well, the following proof of concept patch fixes this issue for me. Please
notice that original version of e820_mark_nosave_range() could fail to
exclude some areas due to alignment issues (exactly what happened to me on
first try) so it still can explain your problem too.

-andrey


Attachments:
(No filename) (0.00 B)
(No filename) (189.00 B)
Download all attachments

2007-02-25 10:24:42

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

On Sunday, 25 February 2007 00:26, Andrey Borzenkov wrote:
> On Суббота 24 февраля 2007, Rafael J. Wysocki wrote:
> > Hi,
> >
> > On Saturday, 24 February 2007 10:55, Andrey Borzenkov wrote:
> > > On Вторник 13 февраля 2007, Andrey Borzenkov wrote:
> > > > On Четверг 07 декабря 2006, Lebedev, Vladimir P wrote:
> > > > > Please register new bug, attach acpidump and dmesg.
> > > >
> > > > http://bugzilla.kernel.org/show_bug.cgi?id=7995
> > > >
> > > > regards
> > >
> > > Well, this starts looking like ACPI is not at fault.
> > >
> > > When reporting AC state ACPI just reads contents of system memory (I
> > > presume it gets updated by BIOS/ACPI when AC state changes). It looks
> > > like this memory area is restored during resume from STD. I updated
> > > mentioned bug report with more detailed description. Now if someone could
> > > suggest a way to catch if specific physical address gets saved/restored
> > > this would finally explain it.
> >
> > First, if you want the reserved memory areas to be left alone by swsusp,
> > you need to mark them as 'nosave'. On x86_64 this is done by the function
> > e820_mark_nosave_range() in arch/x86_64/kernel/e820.c that can be ported to
> > i386 with no problems. However, we haven't found that very useful, so far,
> > since no one has ever reported any problems with the current approach,
> > which is to save and restore them.
> >
>
> Well, the following proof of concept patch fixes this issue for me. Please
> notice that original version of e820_mark_nosave_range() could fail to
> exclude some areas due to alignment issues (exactly what happened to me on
> first try) so it still can explain your problem too.

Great job, thanks for the patch! It looks good, so I'm going to forward it for
merging.

I'll also change the x86_64 version to use PFN_UP and PFN_DOWN.

Greetings,
Rafael

2007-02-25 10:58:07

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

On Sunday, 25 February 2007 11:37, Andrey Borzenkov wrote:
> On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> > On Sunday, 25 February 2007 00:26, Andrey Borzenkov wrote:
> > > On Суббота 24 февраля 2007, Rafael J. Wysocki wrote:
> > > > Hi,
> > > >
> > > > On Saturday, 24 February 2007 10:55, Andrey Borzenkov wrote:
> > > > > On Вторник 13 февраля 2007, Andrey Borzenkov wrote:
> > > > > > On Четверг 07 декабря 2006, Lebedev, Vladimir P wrote:
> > > > > > > Please register new bug, attach acpidump and dmesg.
> > > > > >
> > > > > > http://bugzilla.kernel.org/show_bug.cgi?id=7995
> > > > > >
> > > > > > regards
> > > > >
> > > > > Well, this starts looking like ACPI is not at fault.
> > > > >
> > > > > When reporting AC state ACPI just reads contents of system memory (I
> > > > > presume it gets updated by BIOS/ACPI when AC state changes). It looks
> > > > > like this memory area is restored during resume from STD. I updated
> > > > > mentioned bug report with more detailed description. Now if someone
> > > > > could suggest a way to catch if specific physical address gets
> > > > > saved/restored this would finally explain it.
> > > >
> > > > First, if you want the reserved memory areas to be left alone by
> > > > swsusp, you need to mark them as 'nosave'. On x86_64 this is done by
> > > > the function e820_mark_nosave_range() in arch/x86_64/kernel/e820.c that
> > > > can be ported to i386 with no problems. However, we haven't found that
> > > > very useful, so far, since no one has ever reported any problems with
> > > > the current approach, which is to save and restore them.
> > >
> > > Well, the following proof of concept patch fixes this issue for me.
> > > Please notice that original version of e820_mark_nosave_range() could
> > > fail to exclude some areas due to alignment issues (exactly what happened
> > > to me on first try) so it still can explain your problem too.
> >
> > Great job, thanks for the patch! It looks good, so I'm going to forward it
> > for merging.
> >
>
> Please no; I'm currently testing slightly more polished version; I will send
> it later.

OK

> Could anybody explain (or give pointer to) what happens which region that is
> not page-aligned? In particular, the very first one:
>
> BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
> BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
>
> Will the kernel allocate partial page (how?) or will the kernel ignore last
> (first) incomplete page? In the former case how those incomplete pages can be
> detected?

Well, on x86_64, if I understand e820_register_active_regions() correctly,
the partial pages won't be registered.

Greetings,
Rafael

2007-02-25 17:14:31

by Andrey Borzenkov

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> On Sunday, 25 February 2007 11:37, Andrey Borzenkov wrote:
> > On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> > > On Sunday, 25 February 2007 00:26, Andrey Borzenkov wrote:
> > > > On Суббота 24 февраля 2007, Rafael J. Wysocki wrote:
> > > > > Hi,
> > > > >
> > > > > On Saturday, 24 February 2007 10:55, Andrey Borzenkov wrote:
> > > > > > On Вторник 13 февраля 2007, Andrey Borzenkov wrote:
> > > > > > > On Четверг 07 декабря 2006, Lebedev, Vladimir P wrote:
> > > > > > > > Please register new bug, attach acpidump and dmesg.
> > > > > > >
> > > > > > > http://bugzilla.kernel.org/show_bug.cgi?id=7995
> > > > > > >
> > > > > > > regards
> > > > > >
> > > > > > Well, this starts looking like ACPI is not at fault.
> > > > > >
> > > > > > When reporting AC state ACPI just reads contents of system memory
> > > > > > (I presume it gets updated by BIOS/ACPI when AC state changes).
> > > > > > It looks like this memory area is restored during resume from
> > > > > > STD. I updated mentioned bug report with more detailed
> > > > > > description. Now if someone could suggest a way to catch if
> > > > > > specific physical address gets saved/restored this would finally
> > > > > > explain it.
> > > > >
> > > > > First, if you want the reserved memory areas to be left alone by
> > > > > swsusp, you need to mark them as 'nosave'. On x86_64 this is done
> > > > > by the function e820_mark_nosave_range() in
> > > > > arch/x86_64/kernel/e820.c that can be ported to i386 with no
> > > > > problems. However, we haven't found that very useful, so far,
> > > > > since no one has ever reported any problems with the current
> > > > > approach, which is to save and restore them.
> > > >
> > > > Well, the following proof of concept patch fixes this issue for me.
> > > > Please notice that original version of e820_mark_nosave_range() could
> > > > fail to exclude some areas due to alignment issues (exactly what
> > > > happened to me on first try) so it still can explain your problem
> > > > too.
> > >
> > > Great job, thanks for the patch! It looks good, so I'm going to
> > > forward it for merging.
> >
> > Please no; I'm currently testing slightly more polished version; I will
> > send it later.
>
> OK
>
> > Could anybody explain (or give pointer to) what happens which region that
> > is not page-aligned? In particular, the very first one:
> >
> > BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
> > BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
> >
> > Will the kernel allocate partial page (how?) or will the kernel ignore
> > last (first) incomplete page? In the former case how those incomplete
> > pages can be detected?
>
> Well, on x86_64, if I understand e820_register_active_regions() correctly,
> the partial pages won't be registered.
>

It appears that for low memory kernel will ignore incomplete pages for sure. I
hope it does the same for high memory - but for now I just throw this in and
pray :) This also significantly simplifies patch.

As this touches quite sensitive field, I Cc Andrew - if he considers this
appropriate for mm; or would you do it as part of your tree? Also he probably
can easily clarify memory allocation questions :p

regards

-andrey


Attachments:
(No filename) (0.00 B)
(No filename) (189.00 B)
Download all attachments

2007-02-25 19:05:52

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

On Sunday, 25 February 2007 18:14, Andrey Borzenkov wrote:
> On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> > On Sunday, 25 February 2007 11:37, Andrey Borzenkov wrote:
> > > On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> > > > On Sunday, 25 February 2007 00:26, Andrey Borzenkov wrote:
> > > > > On Суббота 24 февраля 2007, Rafael J. Wysocki wrote:
> > > > > > Hi,
> > > > > >
> > > > > > On Saturday, 24 February 2007 10:55, Andrey Borzenkov wrote:
> > > > > > > On Вторник 13 февраля 2007, Andrey Borzenkov wrote:
> > > > > > > > On Четверг 07 декабря 2006, Lebedev, Vladimir P wrote:
> > > > > > > > > Please register new bug, attach acpidump and dmesg.
> > > > > > > >
> > > > > > > > http://bugzilla.kernel.org/show_bug.cgi?id=7995
> > > > > > > >
> > > > > > > > regards
> > > > > > >
> > > > > > > Well, this starts looking like ACPI is not at fault.
> > > > > > >
> > > > > > > When reporting AC state ACPI just reads contents of system memory
> > > > > > > (I presume it gets updated by BIOS/ACPI when AC state changes).
> > > > > > > It looks like this memory area is restored during resume from
> > > > > > > STD. I updated mentioned bug report with more detailed
> > > > > > > description. Now if someone could suggest a way to catch if
> > > > > > > specific physical address gets saved/restored this would finally
> > > > > > > explain it.
> > > > > >
> > > > > > First, if you want the reserved memory areas to be left alone by
> > > > > > swsusp, you need to mark them as 'nosave'. On x86_64 this is done
> > > > > > by the function e820_mark_nosave_range() in
> > > > > > arch/x86_64/kernel/e820.c that can be ported to i386 with no
> > > > > > problems. However, we haven't found that very useful, so far,
> > > > > > since no one has ever reported any problems with the current
> > > > > > approach, which is to save and restore them.
> > > > >
> > > > > Well, the following proof of concept patch fixes this issue for me.
> > > > > Please notice that original version of e820_mark_nosave_range() could
> > > > > fail to exclude some areas due to alignment issues (exactly what
> > > > > happened to me on first try) so it still can explain your problem
> > > > > too.
> > > >
> > > > Great job, thanks for the patch! It looks good, so I'm going to
> > > > forward it for merging.
> > >
> > > Please no; I'm currently testing slightly more polished version; I will
> > > send it later.
> >
> > OK
> >
> > > Could anybody explain (or give pointer to) what happens which region that
> > > is not page-aligned? In particular, the very first one:
> > >
> > > BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
> > > BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
> > >
> > > Will the kernel allocate partial page (how?) or will the kernel ignore
> > > last (first) incomplete page? In the former case how those incomplete
> > > pages can be detected?
> >
> > Well, on x86_64, if I understand e820_register_active_regions() correctly,
> > the partial pages won't be registered.
> >
>
> It appears that for low memory kernel will ignore incomplete pages for sure. I
> hope it does the same for high memory - but for now I just throw this in and
> pray :)

You don't need to do this for highmem, because swsusp won't save reserved
highmem pages anyway.

> This also significantly simplifies patch.
>
> As this touches quite sensitive field, I Cc Andrew - if he considers this
> appropriate for mm; or would you do it as part of your tree? Also he probably
> can easily clarify memory allocation questions :p

The patch looks good, but the changelog does not. First, AFAICT, the x86_64
code doesn't touch anything outside the e820 map. Why do you think it does?

Second, it is not true that the region in question is at 0xee00 on x86_64.
At least on my box it's above the end of RAM.

I think the x86_64 version is correct too.

Greetings,
Rafael

2007-02-26 21:21:42

by Rafael J. Wysocki

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

On Monday, 26 February 2007 21:35, Andrey Borzenkov wrote:
> On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> >
> > The patch looks good, but the changelog does not. First, AFAICT, the
> > x86_64 code doesn't touch anything outside the e820 map. Why do you think
> > it does?
> >
>
> the following code:
>
> paddr = round_down(e820.map[0].addr + e820.map[0].size, PAGE_SIZE);
> for (i = 1; i < e820.nr_map; i++) {
> struct e820entry *ei = &e820.map[i];
>
> if (paddr < ei->addr)
> e820_mark_nosave_range(paddr,
> round_up(ei->addr, PAGE_SIZE));
>
> obviously will mark region *between* two e820 regions if they are not
> adjacent. I do not say that it is wrong (I have no idea); but exactly because
> I have no idea I tried to avoid it.

Yes, you are right, sorry. We have to do this for x86_64, because there are
such holes in there on machines with more than 2 GB of RAM and swsusp chokes
on them if they are not marked.

On i386 we shouldn't really mark reserved areas in the highmem zone(s) as
nosave, because they are handled in a different way.

> > Second, it is not true that the region in question is at 0xee00 on x86_64.
> > At least on my box it's above the end of RAM.
> >
>
> On my box the problem region starts at ee800 :) But you are right, it does not
> belong here.
>
> > I think the x86_64 version is correct too.
> >
>
> I do not say it is not. I just say that it does something I cannot verify so I
> better avoid it (i.e. I better change existing behaviour as little as
> possible).

OK

Can you please test your patch with the loop in e820_mark_nosave_regions()
restricted to the zones below highmem?

Rafael

2007-05-19 18:03:22

by Andrey Borzenkov

[permalink] [raw]
Subject: Re: 2.6.19: ACPI reports AC not present after resume from STD

On Tuesday 06 March 2007, Rafael J. Wysocki wrote:
> [changed Cc list]
>
> On Sunday, 25 February 2007 18:14, Andrey Borzenkov wrote:
> > On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> > > On Sunday, 25 February 2007 11:37, Andrey Borzenkov wrote:
> > > > On Воскресенье 25 февраля 2007, Rafael J. Wysocki wrote:
> > > > > On Sunday, 25 February 2007 00:26, Andrey Borzenkov wrote:
> > > > > > On Суббота 24 февраля 2007, Rafael J. Wysocki wrote:
> > > > > > > Hi,
> > > > > > >
> > > > > > > On Saturday, 24 February 2007 10:55, Andrey Borzenkov wrote:
> > > > > > > > On Вторник 13 февраля 2007, Andrey Borzenkov wrote:
> > > > > > > > > On Четверг 07 декабря 2006, Lebedev, Vladimir P wrote:
> > > > > > > > > > Please register new bug, attach acpidump and dmesg.
> > > > > > > > >
> > > > > > > > > http://bugzilla.kernel.org/show_bug.cgi?id=7995
> > > > > > > > >
> > > > > > > > > regards
> > > > > > > >
> > > > > > > > Well, this starts looking like ACPI is not at fault.
> > > > > > > >
> > > > > > > > When reporting AC state ACPI just reads contents of system
> > > > > > > > memory (I presume it gets updated by BIOS/ACPI when AC state
> > > > > > > > changes). It looks like this memory area is restored during
> > > > > > > > resume from STD. I updated mentioned bug report with more
> > > > > > > > detailed description. Now if someone could suggest a way to
> > > > > > > > catch if specific physical address gets saved/restored this
> > > > > > > > would finally explain it.
> > > > > > >
> > > > > > > First, if you want the reserved memory areas to be left alone
> > > > > > > by swsusp, you need to mark them as 'nosave'. On x86_64 this
> > > > > > > is done by the function e820_mark_nosave_range() in
> > > > > > > arch/x86_64/kernel/e820.c that can be ported to i386 with no
> > > > > > > problems. However, we haven't found that very useful, so far,
> > > > > > > since no one has ever reported any problems with the current
> > > > > > > approach, which is to save and restore them.
> > > > > >
> > > > > > Well, the following proof of concept patch fixes this issue for
> > > > > > me. Please notice that original version of
> > > > > > e820_mark_nosave_range() could fail to exclude some areas due to
> > > > > > alignment issues (exactly what happened to me on first try) so it
> > > > > > still can explain your problem too.
> > > > >
> > > > > Great job, thanks for the patch! It looks good, so I'm going to
> > > > > forward it for merging.
> > > >
> > > > Please no; I'm currently testing slightly more polished version; I
> > > > will send it later.
> > >
> > > OK
> > >
> > > > Could anybody explain (or give pointer to) what happens which region
> > > > that is not page-aligned? In particular, the very first one:
> > > >
> > > > BIOS-e820: 0000000000000000 - 000000000009fc00 (usable)
> > > > BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
> > > >
> > > > Will the kernel allocate partial page (how?) or will the kernel
> > > > ignore last (first) incomplete page? In the former case how those
> > > > incomplete pages can be detected?
> > >
> > > Well, on x86_64, if I understand e820_register_active_regions()
> > > correctly, the partial pages won't be registered.
> >
> > It appears that for low memory kernel will ignore incomplete pages for
> > sure. I hope it does the same for high memory - but for now I just throw
> > this in and pray :) This also significantly simplifies patch.
>
> Well, can you please check if the appended modification of your patch still
> works?
>

what is the state of this problem? It is still not fixed in 2.6.22-rc2 and
this patch no more applies as well (changes are trivial but I cannot test
them because USB refuses to suspend on my system in this version :)

In previous versions patch worked just fine.

This is http://bugzilla.kernel.org/show_bug.cgi?id=7995 BTW.

> Thanks,
> Rafael
>
>
> ---
> arch/i386/kernel/e820.c | 47
> +++++++++++++++++++++++++++++++++++++++++++++++ arch/i386/kernel/setup.c |
> 1 +
> include/asm-i386/e820.h | 1 +
> 3 files changed, 49 insertions(+)
>
> Index: linux-2.6.21-rc2/arch/i386/kernel/e820.c
> ===================================================================
> --- linux-2.6.21-rc2.orig/arch/i386/kernel/e820.c
> +++ linux-2.6.21-rc2/arch/i386/kernel/e820.c
> @@ -313,6 +313,53 @@ static int __init request_standard_resou
>
> subsys_initcall(request_standard_resources);
>
> +/*
> + * Mark pages corresponding to given pfn range as 'nosave'.
> + */
> +static void __init
> +e820_mark_nosave_range(unsigned long start_pfn, unsigned long end_pfn)
> +{
> + unsigned long pfn;
> +
> + if (start_pfn >= end_pfn)
> + return;
> +
> + printk("Nosave address range: %016Lx - %016Lx\n",
> + PFN_PHYS(start_pfn), PFN_PHYS(end_pfn));
> + for (pfn = start_pfn; pfn < end_pfn; pfn++)
> + if (pfn_valid(pfn))
> + SetPageNosave(pfn_to_page(pfn));
> +}
> +
> +/*
> + * Find the ranges of physical addresses that do not correspond to
> + * e820 RAM areas and mark the corresponding pages as nosave for software
> + * suspend and suspend to RAM.
> + *
> + * This function requires the e820 map to be sorted and without any
> + * overlapping entries and assumes the first e820 area to be RAM.
> + */
> +void __init e820_mark_nosave_regions(void)
> +{
> + int i;
> + unsigned long pfn;
> +
> + pfn = PFN_DOWN(e820.map[0].addr + e820.map[0].size);
> + for (i = 1; i < e820.nr_map; i++) {
> + struct e820entry *ei = &e820.map[i];
> +
> + if (pfn < PFN_UP(ei->addr))
> + e820_mark_nosave_range(pfn, PFN_UP(ei->addr));
> +
> + pfn = PFN_DOWN(ei->addr + ei->size);
> + if (ei->type != E820_RAM)
> + e820_mark_nosave_range(PFN_UP(ei->addr), pfn);
> +
> + if (pfn >= max_low_pfn)
> + break;
> + }
> +}
> +
> void __init add_memory_region(unsigned long long start,
> unsigned long long size, int type)
> {
> Index: linux-2.6.21-rc2/arch/i386/kernel/setup.c
> ===================================================================
> --- linux-2.6.21-rc2.orig/arch/i386/kernel/setup.c
> +++ linux-2.6.21-rc2/arch/i386/kernel/setup.c
> @@ -648,6 +648,7 @@ void __init setup_arch(char **cmdline_p)
> #endif
>
> e820_register_memory();
> + e820_mark_nosave_regions();
>
> #ifdef CONFIG_VT
> #if defined(CONFIG_VGA_CONSOLE)
> Index: linux-2.6.21-rc2/include/asm-i386/e820.h
> ===================================================================
> --- linux-2.6.21-rc2.orig/include/asm-i386/e820.h
> +++ linux-2.6.21-rc2/include/asm-i386/e820.h
> @@ -43,6 +43,7 @@ extern void register_bootmem_low_pages(u
> extern void e820_register_memory(void);
> extern void limit_regions(unsigned long long size);
> extern void print_memory_map(char *who);
> +extern void e820_mark_nosave_regions(void);
>
> #endif/*!__ASSEMBLY__*/



Attachments:
(No filename) (6.70 kB)
(No filename) (189.00 B)
Download all attachments