Without this, we'll get early userspace segfaults like this in the PVCLOCK_FIXMAP area:
[ 0.602244] init[1]: segfault at ffffffffff5ff020 ip 00007fff7154afc1 sp 00007fff71540c08 error 5 [ 0.603026] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b [ 0.603026] [ 0.603624] CPU: 0 PID: 1 Comm: init Not tainted 3.16.53-rc2-stable+ #240 [ 0.604002] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 04/01/2014 [ 0.604002] 0000000000000000 ffff88003e31bc80 ffffffff81741db3 ffffffff81a60558 [ 0.604002] ffff88003d222380 ffff88003e31bcf8 ffffffff8173da0e 0000000000000010 [ 0.604002] ffff88003e31bd08 ffff88003e31bca8 0000000000000000 000000000000000b [ 0.604002] Call Trace: [ 0.604002] [<ffffffff81741db3>] dump_stack+0x64/0x82 [ 0.604002] [<ffffffff8173da0e>] panic+0xc8/0x203 [ 0.604002] [<ffffffff8109c7f0>] do_exit+0xb00/0xb00 [ 0.604002] [<ffffffff8109d5ff>] do_group_exit+0x3f/0xa0 [ 0.604002] [<ffffffff810ac9c2>] get_signal_to_deliver+0x1c2/0x5e0 [ 0.604002] [<ffffffff810494f8>] do_signal+0x48/0x730 [ 0.604002] [<ffffffff8173d70c>] ? __bad_area_nosemaphore+0x1bd/0x1ca [ 0.604002] [<ffffffff8108cad4>] ? __do_page_fault+0x84/0x400 [ 0.604002] [<ffffffff81049c45>] do_notify_resume+0x65/0x80 [ 0.604002] [<ffffffff8174c002>] retint_signal+0x48/0x86 [ 0.604002] Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffff9fffffff) [ 0.604002] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
This is probably too big of a hammer and needs some polishing but it's working :-)
Signed-off-by: Juerg Haefliger juerg.haefliger@canonical.com --- arch/x86/mm/kaiser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/x86/mm/kaiser.c b/arch/x86/mm/kaiser.c index fc50dee484f6..3f0b0b41badc 100644 --- a/arch/x86/mm/kaiser.c +++ b/arch/x86/mm/kaiser.c @@ -202,7 +202,7 @@ static int kaiser_add_user_map(const void *__start_addr, unsigned long size, ret = -EIO; break; } - pte = kaiser_pagetable_walk(address, flags & _PAGE_USER); + pte = kaiser_pagetable_walk(address, true); if (!pte) { ret = -ENOMEM; break;