Patchwork Current kernel fails to compile with KVM on PowerPC

login
register
mail settings
Submitter Alexander Graf
Date Feb. 26, 2012, 11:43 a.m.
Message ID <3E36BEF4-E15F-410A-82C1-A8EB17AEF0DA@suse.de>
Download mbox | patch
Permalink /patch/143081/
State New
Headers show

Comments

Alexander Graf - Feb. 26, 2012, 11:43 a.m.
On 25.02.2012, at 15:51, Jörg Sommer wrote:

> Jörg Sommer hat am Tue 21. Feb, 09:32 (+0100) geschrieben:
>> Alexander Graf hat am Mon 20. Feb, 22:27 (+0100) geschrieben:
>>> On 20.02.2012, at 18:38, Jörg Sommer wrote:
>>>> Alexander Graf hat am Tue 22. Nov, 22:29 (+0100) geschrieben:
>>>>> On 22.11.2011, at 21:04, Jörg Sommer wrote:
>>>>>> [1] »kernel BUG at include/linux/kvm_host.h:603!«
>>>>>> http://www.mail-archive.com/kvm@vger.kernel.org/msg61433.html
>>>>> 
>>>>> This is unfortunately still there. It's because of preemption being
>>>>> enabled. Please just use CONFIG_PREEMPT_NONE for the time being
>>>> 
>>>> This doesn't help. I've build with CONFIG_PREEMPT_NONE, but I'm getting
>>>> this Oops, when I start qemu.
>>> 
>>> Could you please try git://git.kernel.org/pub/scm/virt/kvm/kvm.git? I
>>> fixed a bunch of things with preemption since then and it definitely
>>> worked for me. If it still fails in that tree, I can try again to
>>> reproduce it :).
>> 
>> This kernel (e9badff4b38a3f8b2c20aa8a30db210caf85a497) fails to build:
>> 
>>  CC [M]  arch/powerpc/kvm/book3s_pr.o
>> arch/powerpc/kvm/book3s_pr.c: In function ‘kvm_vcpu_ioctl_get_one_reg’:
>> arch/powerpc/kvm/book3s_pr.c:883:45: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:80: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:284: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:327: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:459: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:748: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:1112: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:1476: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:883:1867: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c: In function ‘kvm_vcpu_ioctl_set_one_reg’:
>> arch/powerpc/kvm/book3s_pr.c:898:79: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:898:114: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:898:319: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:898:364: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:898:502: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:898:591: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> arch/powerpc/kvm/book3s_pr.c:898:2061: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>> cc1: all warnings being treated as errors
>> make[3]: *** [arch/powerpc/kvm/book3s_pr.o] Fehler 1
>> make[2]: *** [arch/powerpc/kvm] Fehler 2
>> make[2]: *** Warte auf noch nicht beendete Prozesse...
> 
> The culprit is this patch:
> 
> commit 784f1782e3c9cab310d6c513df966c547c3f17aa
> Author: Alexander Graf <agraf@suse.de>
> Date:   Wed Sep 14 21:45:23 2011 +0200
> 
>    KVM: PPC: Add support for explicit HIOR setting
> 
>    Until now, we always set HIOR based on the PVR, but this is just wrong.
>    Instead, we should be setting HIOR explicitly, so user space can decide
>    what the initial HIOR value is - just like on real hardware.
> 
>    We keep the old PVR based way around for backwards compatibility, but
>    once user space uses the SET_ONE_REG based method, we drop the PVR logic.
> 
>    Signed-off-by: Alexander Graf <agraf@suse.de>
> 
> diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
> index 089c61b..5985209 100644
> --- a/arch/powerpc/kvm/powerpc.c
> +++ b/arch/powerpc/kvm/powerpc.c
> @@ -212,6 +212,7 @@ int kvm_dev_ioctl_check_extension(long ext)
>        case KVM_CAP_PPC_BOOKE_SREGS:
> #else
>        case KVM_CAP_PPC_SEGSTATE:
> +       case KVM_CAP_PPC_HIOR:
>        case KVM_CAP_PPC_PAPR:
> #endif
>        case KVM_CAP_PPC_UNSET_IRQ:
> @@ -652,6 +653,11 @@ static int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu,
>        int r = -EINVAL;
> 
>        switch (reg->id) {
> +#ifdef CONFIG_PPC_BOOK3S
> +       case KVM_REG_PPC_HIOR:
> +               r = put_user(to_book3s(vcpu)->hior, (u64 __user *)reg->addr);
> +               break;
> +#endif
>        default:
>                break;
>        }
> @@ -665,6 +671,13 @@ static int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu,
>        int r = -EINVAL;
> 
>        switch (reg->id) {
> +#ifdef CONFIG_PPC_BOOK3S
> +       case KVM_ONE_REG_PPC_HIOR:
> +               r = get_user(to_book3s(vcpu)->hior, (u64 __user *)reg->addr);
> +               if (!r)
> +                       to_book3s(vcpu)->hior_explicit = true;
> +               break;
> +#endif
>        default:
>                break;
>        }
> 
> Later, this code was moved to arch/powerpc/kvm/book3s_pr.c by
> 
> commit c6afb78d175ae6cf99f4191fbb258e54478b0371
> Author: Paul Mackerras <paulus@samba.org>
> Date:   Mon Dec 12 12:26:50 2011 +0000
> 
>    KVM: PPC: Move kvm_vcpu_ioctl_[gs]et_one_reg down to platform-specific code

Yikes. Does this patch work for you?




--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jörg Sommer - Feb. 27, 2012, 12:08 a.m.
Alexander Graf hat am Sun 26. Feb, 12:43 (+0100) geschrieben:
> On 25.02.2012, at 15:51, Jörg Sommer wrote:
> > Jörg Sommer hat am Tue 21. Feb, 09:32 (+0100) geschrieben:
> >> Alexander Graf hat am Mon 20. Feb, 22:27 (+0100) geschrieben:
> >>> On 20.02.2012, at 18:38, Jörg Sommer wrote:
> >>>> Alexander Graf hat am Tue 22. Nov, 22:29 (+0100) geschrieben:
> >>>>> On 22.11.2011, at 21:04, Jörg Sommer wrote:
> >>>>>> [1] »kernel BUG at include/linux/kvm_host.h:603!«
> >>>>>> http://www.mail-archive.com/kvm@vger.kernel.org/msg61433.html
> >>>>> 
> >>>>> This is unfortunately still there. It's because of preemption being
> >>>>> enabled. Please just use CONFIG_PREEMPT_NONE for the time being
> >>>> 
> >>>> This doesn't help. I've build with CONFIG_PREEMPT_NONE, but I'm getting
> >>>> this Oops, when I start qemu.
> >>> 
> >>> Could you please try git://git.kernel.org/pub/scm/virt/kvm/kvm.git? I
> >>> fixed a bunch of things with preemption since then and it definitely
> >>> worked for me. If it still fails in that tree, I can try again to
> >>> reproduce it :).
> >> 
> >> This kernel (e9badff4b38a3f8b2c20aa8a30db210caf85a497) fails to build:
> >> 
> >>  CC [M]  arch/powerpc/kvm/book3s_pr.o
> >> arch/powerpc/kvm/book3s_pr.c: In function ‘kvm_vcpu_ioctl_get_one_reg’:
> >> arch/powerpc/kvm/book3s_pr.c:883:45: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
> >> arch/powerpc/kvm/book3s_pr.c:883:80: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]

> Yikes. Does this patch work for you?

> diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
> index ee222ec..f329eae 100644
> --- a/arch/powerpc/kvm/book3s_pr.c
> +++ b/arch/powerpc/kvm/book3s_pr.c
> @@ -880,7 +880,8 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
>  
>         switch (reg->id) {
>         case KVM_REG_PPC_HIOR:
> -               r = put_user(to_book3s(vcpu)->hior, (u64 __user *)reg->addr);
> +               r = put_user(to_book3s(vcpu)->hior,
> +                            (u64 __user *)(long)reg->addr);

Yes and no. It brings me a step further, but not to a working kernel.

  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  CALL    scripts/checksyscalls.sh
  CC [M]  arch/powerpc/kvm/book3s_pr.o
  LD [M]  arch/powerpc/kvm/kvm.o
  Building modules, stage 2.
  MODPOST 227 modules
ERROR: "__get_user_bad" [arch/powerpc/kvm/kvm.ko] undefined!
make[1]: *** [__modpost] Fehler 1
make: *** [modules] Fehler 2
Alexander Graf - Feb. 27, 2012, 12:30 a.m.
On 27.02.2012, at 01:08, Jörg Sommer wrote:

> Alexander Graf hat am Sun 26. Feb, 12:43 (+0100) geschrieben:
>> On 25.02.2012, at 15:51, Jörg Sommer wrote:
>>> Jörg Sommer hat am Tue 21. Feb, 09:32 (+0100) geschrieben:
>>>> Alexander Graf hat am Mon 20. Feb, 22:27 (+0100) geschrieben:
>>>>> On 20.02.2012, at 18:38, Jörg Sommer wrote:
>>>>>> Alexander Graf hat am Tue 22. Nov, 22:29 (+0100) geschrieben:
>>>>>>> On 22.11.2011, at 21:04, Jörg Sommer wrote:
>>>>>>>> [1] »kernel BUG at include/linux/kvm_host.h:603!«
>>>>>>>> http://www.mail-archive.com/kvm@vger.kernel.org/msg61433.html
>>>>>>> 
>>>>>>> This is unfortunately still there. It's because of preemption being
>>>>>>> enabled. Please just use CONFIG_PREEMPT_NONE for the time being
>>>>>> 
>>>>>> This doesn't help. I've build with CONFIG_PREEMPT_NONE, but I'm getting
>>>>>> this Oops, when I start qemu.
>>>>> 
>>>>> Could you please try git://git.kernel.org/pub/scm/virt/kvm/kvm.git? I
>>>>> fixed a bunch of things with preemption since then and it definitely
>>>>> worked for me. If it still fails in that tree, I can try again to
>>>>> reproduce it :).
>>>> 
>>>> This kernel (e9badff4b38a3f8b2c20aa8a30db210caf85a497) fails to build:
>>>> 
>>>> CC [M]  arch/powerpc/kvm/book3s_pr.o
>>>> arch/powerpc/kvm/book3s_pr.c: In function ‘kvm_vcpu_ioctl_get_one_reg’:
>>>> arch/powerpc/kvm/book3s_pr.c:883:45: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
>>>> arch/powerpc/kvm/book3s_pr.c:883:80: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
> 
>> Yikes. Does this patch work for you?
> 
>> diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
>> index ee222ec..f329eae 100644
>> --- a/arch/powerpc/kvm/book3s_pr.c
>> +++ b/arch/powerpc/kvm/book3s_pr.c
>> @@ -880,7 +880,8 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
>> 
>>        switch (reg->id) {
>>        case KVM_REG_PPC_HIOR:
>> -               r = put_user(to_book3s(vcpu)->hior, (u64 __user *)reg->addr);
>> +               r = put_user(to_book3s(vcpu)->hior,
>> +                            (u64 __user *)(long)reg->addr);
> 
> Yes and no. It brings me a step further, but not to a working kernel.
> 
>  CHK     include/linux/version.h
>  CHK     include/generated/utsrelease.h
>  CALL    scripts/checksyscalls.sh
>  CC [M]  arch/powerpc/kvm/book3s_pr.o
>  LD [M]  arch/powerpc/kvm/kvm.o
>  Building modules, stage 2.
>  MODPOST 227 modules
> ERROR: "__get_user_bad" [arch/powerpc/kvm/kvm.ko] undefined!

Ah, because you can't get_user u64s I suppose. Sigh. As a quick hack, just comment out the get/put_user lines - you don't care about configuring HIOR on ppc32 anyways. I'll try to come up with something :)


Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jörg Sommer - Feb. 27, 2012, 11:31 a.m.
Alexander Graf hat am Mon 27. Feb, 01:30 (+0100) geschrieben:
> On 27.02.2012, at 01:08, Jörg Sommer wrote:
> 
> > Alexander Graf hat am Sun 26. Feb, 12:43 (+0100) geschrieben:
> >> On 25.02.2012, at 15:51, Jörg Sommer wrote:
> >>> Jörg Sommer hat am Tue 21. Feb, 09:32 (+0100) geschrieben:
> >>>> Alexander Graf hat am Mon 20. Feb, 22:27 (+0100) geschrieben:
> >>>>> On 20.02.2012, at 18:38, Jörg Sommer wrote:
> >>>>>> Alexander Graf hat am Tue 22. Nov, 22:29 (+0100) geschrieben:
> >>>>>>> On 22.11.2011, at 21:04, Jörg Sommer wrote:
> >>>>>>>> [1] »kernel BUG at include/linux/kvm_host.h:603!«
> >>>>>>>> http://www.mail-archive.com/kvm@vger.kernel.org/msg61433.html
> >>>>>>> 
> >>>>>>> This is unfortunately still there. It's because of preemption being
> >>>>>>> enabled. Please just use CONFIG_PREEMPT_NONE for the time being
> >>>>>> 
> >>>>>> This doesn't help. I've build with CONFIG_PREEMPT_NONE, but I'm getting
> >>>>>> this Oops, when I start qemu.
> >>>>> 
> >>>>> Could you please try git://git.kernel.org/pub/scm/virt/kvm/kvm.git? I
> >>>>> fixed a bunch of things with preemption since then and it definitely
> >>>>> worked for me. If it still fails in that tree, I can try again to
> >>>>> reproduce it :).
> >>>> 
> >>>> This kernel (e9badff4b38a3f8b2c20aa8a30db210caf85a497) fails to build:
> >>>> 
> >>>> CC [M]  arch/powerpc/kvm/book3s_pr.o
> >>>> arch/powerpc/kvm/book3s_pr.c: In function ‘kvm_vcpu_ioctl_get_one_reg’:
> >>>> arch/powerpc/kvm/book3s_pr.c:883:45: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
> >>>> arch/powerpc/kvm/book3s_pr.c:883:80: error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]
> > 
> >> Yikes. Does this patch work for you?
> > 
> >> diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
> >> index ee222ec..f329eae 100644
> >> --- a/arch/powerpc/kvm/book3s_pr.c
> >> +++ b/arch/powerpc/kvm/book3s_pr.c
> >> @@ -880,7 +880,8 @@ int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
> >> 
> >>        switch (reg->id) {
> >>        case KVM_REG_PPC_HIOR:
> >> -               r = put_user(to_book3s(vcpu)->hior, (u64 __user *)reg->addr);
> >> +               r = put_user(to_book3s(vcpu)->hior,
> >> +                            (u64 __user *)(long)reg->addr);
> > 
> > Yes and no. It brings me a step further, but not to a working kernel.
> > 
> >  CHK     include/linux/version.h
> >  CHK     include/generated/utsrelease.h
> >  CALL    scripts/checksyscalls.sh
> >  CC [M]  arch/powerpc/kvm/book3s_pr.o
> >  LD [M]  arch/powerpc/kvm/kvm.o
> >  Building modules, stage 2.
> >  MODPOST 227 modules
> > ERROR: "__get_user_bad" [arch/powerpc/kvm/kvm.ko] undefined!
> 
> Ah, because you can't get_user u64s I suppose. Sigh. As a quick hack,
> just comment out the get/put_user lines - you don't care about
> configuring HIOR on ppc32 anyways. I'll try to come up with something
> :)

I've removed these lines and got a kernel. But it crashes:

# modprobe kvm
# qemu-system-ppc -enable-kvm -curses
[  155.982144] BUG: sleeping function called from invalid context at arch/powerpc/kvm/../../../virt/kvm/kvm_main.c:1078
[  155.982552] in_atomic(): 0, irqs_disabled(): 1, pid: 1727, name: qemu-system-ppc
[  155.982807] Call Trace:
[  155.982916] [e31ad820] [c000bc44] show_stack+0xbc/0x194 (unreliable)
[  155.983175] [e31ad870] [c047bc2c] dump_stack+0x30/0x38
[  155.983372] [e31ad880] [c0062070] __might_sleep+0xf8/0x100
[  155.983620] [e31ad890] [ea6c1830] hva_to_pfn.isra.41+0xc0/0x340 [kvm]
[  155.983869] [e31ad8d0] [ea6c1b6c] __gfn_to_pfn+0xbc/0xc4 [kvm]
[  155.984110] [e31ad8f0] [ea6c1bec] gfn_to_pfn+0x38/0x40 [kvm]
[  155.984335] [e31ad900] [ea6c9f60] kvmppc_gfn_to_pfn+0xb8/0xc8 [kvm]
[  155.984571] [e31ad920] [ea6ce454] kvmppc_mmu_map_page+0x3c/0x274 [kvm]
[  155.984817] [e31ad970] [ea6cadc4] kvmppc_handle_pagefault+0x264/0x3d0 [kvm]
[  155.985083] [e31ad9c0] [ea6cb22c] kvmppc_handle_exit+0x18c/0x800 [kvm]
[  155.985329] [e31ada00] [ea6cd18c] kvmppc_handler_highmem+0x5c/0x6c [kvm]
[  155.985580] [e31adac0] [ea6cbebc] kvmppc_vcpu_run+0x184/0x244 [kvm]
[  155.985817] [e31ade20] [ea6c6170] kvm_arch_vcpu_ioctl_run+0x348/0x374 [kvm]
[  155.986080] [e31ade50] [ea6bfc70] kvm_vcpu_ioctl+0x158/0x888 [kvm]
[  155.986308] [e31adea0] [c0129080] do_vfs_ioctl+0x714/0x78c
[  155.986506] [e31adf10] [c0129160] sys_ioctl+0x68/0x8c
[  155.986693] [e31adf40] [c0013b70] ret_from_syscall+0x0/0x38
[  155.986915] --- Exception: c01 at 0xf4eda98
[  155.986921]     LR = 0xf4ed9fc
[  155.992590] Page fault in user mode with in_atomic() = 1 mm = e3021e00
[  155.992869] NIP = 1017551c  MSR = d032
[  155.993273] PowerMac
[  155.993357] Modules linked in: kvm ipv6 fuse option usb_wwan usbserial snd_powermac b43 mac80211 cfg80211 snd_aoa_i2sbus usb_storage snd_pcm_oss snd_mixer_oss snd_pcm snd_page_alloc snd_seq snd_timer snd_seq_d
[  155.994742] NIP: 1017551c LR: 10175514 CTR: 0f5a3420
[  155.994920] REGS: e31adf50 TRAP: 0301   Not tainted  (3.3.0-rc3-04608-ge9badff4-dirty)
[  155.995186] MSR: 0000d032 <EE,PR,ME,IR,DR,RI>  CR: 28002464  XER: 20000000
[  155.995516] DAR: 48023008, DSISR: 40000000
[  155.995663] TASK = e33322b0[1727] 'qemu-system-ppc' THREAD: e31ac000
10175514 48847c60 4884f8e0 10cadd08 48023000 28002464 00000002 0f4eda98 
0000d032 00000000 00001032 00000001 e31ac000 
[  155.996535] NIP [1017551c] 0x1017551c
[  155.996668] LR [10175514] 0x10175514
[  155.996793] Call Trace:
[  155.997049] 
[  156.974149] Kernel panic - not syncing: Fatal exception in interrupt
[  156.974390] Rebooting in 180 seconds..

Patch

diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index ee222ec..f329eae 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -880,7 +880,8 @@  int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
 
        switch (reg->id) {
        case KVM_REG_PPC_HIOR:
-               r = put_user(to_book3s(vcpu)->hior, (u64 __user *)reg->addr);
+               r = put_user(to_book3s(vcpu)->hior,
+                            (u64 __user *)(long)reg->addr);
                break;
        default:
                break;
@@ -895,7 +896,8 @@  int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg)
 
        switch (reg->id) {
        case KVM_REG_PPC_HIOR:
-               r = get_user(to_book3s(vcpu)->hior, (u64 __user *)reg->addr);
+               r = get_user(to_book3s(vcpu)->hior,
+                            (u64 __user *)(long)reg->addr);
                if (!r)
                        to_book3s(vcpu)->hior_explicit = true;
                break;