Thread (37 messages) flat view 37 messages, 5 authors, 2016-08-11

Re: [Resend][PATCH] x86/power/64: Always create temporary identity mapping correctly

From: "Rafael J. Wysocki" <rafael@kernel.org>
Date: 2016-08-11 01:35:45
Also in: lkml

On Thu, Aug 11, 2016 at 3:17 AM, Thomas Garnier [off-list ref] wrote:
On Wed, Aug 10, 2016 at 5:35 PM, Rafael J. Wysocki [off-list ref] wrote:
quoted
On Wed, Aug 10, 2016 at 11:59 PM, Jiri Kosina [off-list ref] wrote:
quoted
On Wed, 10 Aug 2016, Rafael J. Wysocki wrote:
quoted
So I used your .config to generate one for my test machine and with
that I can reproduce.
Was that the config I've sent, or did Boris provide one as well? Which one
are you able to reproduce with please?
It's the Boris' one.

Moreover, I have found the options that make the difference: unsetting
CONFIG_PROVE_LOCKING and CONFIG_DEBUG_LOCK_ALLOC (which also will
unset CONFIG_LOCKDEP AFAICS) in it makes hibernation work again with
CONFIG_RANDOMIZE_MEMORY set and with the $subject patch applied.

Unbelievable, but that's what I'm seeing.
Nice find!
quoted
Now, that leads to a few questions:

- How does lockdep change the picture so it matters for hibernation?
- Why is hibernation the only piece that's affected?
- Why is RANDOMIZE_MEMORY necessary to make this breakage show up?

Thomas, any ideas?
No idea so far. I will investigate though.

We had an unrelated issue with CONFIG_DEBUG_PAGEALLOC on early boot. I
don't think it was related because it was on early boot and with
certain e820 memory layout (and PUD randomization that I disabled on
the previous patch test). The fix is on tip:
http://git.kernel.org/cgit/linux/kernel/git/tip/tip.git/commit/?id=fb754f958f8e46202c1efd7f66d5b3db1208117d
Well, I don't think this is related.

In the meantime, I went back to my original .config and verified that
setting CONFIG_DEBUG_LOCK_ALLOC in it caused hibernation to fail (with
CONFIG_RANDOMIZE_MEMORY set and with the $subject patch applied), so
this really matters somehow.

Besides, now that I have a reproducer, I can check various other
things and for example this change (sorry for broken whitespace):

Index: linux-pm/arch/x86/mm/kaslr.c
===================================================================
--- linux-pm.orig/arch/x86/mm/kaslr.c
+++ linux-pm/arch/x86/mm/kaslr.c
@@ -122,7 +122,7 @@ void __init kernel_randomize_memory(void
         prandom_bytes_state(&rand_state, &rand, sizeof(rand));
         entropy = (rand % (entropy + 1)) & PUD_MASK;
         vaddr += entropy;
-        *kaslr_regions[i].base = vaddr;
+        *kaslr_regions[i].base += PUD_SIZE;

         /*
          * Jump the region and add a minimum padding based on
makes hibernation work for me again in the above configuration.  To
me, this means that the $subject patch works as expected and the
problem really is related to the vaddr value being too big.

Thanks,
Rafael
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help