kernel bug in "Drop WIMG in favour of new constants"?

Darrick J. Wong darrick.wong at oracle.com
Fri Jun 17 11:49:46 AEST 2016


On Thu, Jun 16, 2016 at 08:01:55PM +0530, Aneesh Kumar K.V wrote:
> "Aneesh Kumar K.V" <aneesh.kumar at linux.vnet.ibm.com> writes:
> 
> > "Aneesh Kumar K.V" <aneesh.kumar at linux.vnet.ibm.com> writes:
> >
> >> "Aneesh Kumar K.V" <aneesh.kumar at linux.vnet.ibm.com> writes:
> >>
> >>> "Darrick J. Wong" <darrick.wong at oracle.com> writes:
> >>>
> >>>> On Thu, Jun 16, 2016 at 03:23:47PM +1000, Michael Ellerman wrote:
> >>>>> On Wed, 2016-06-15 at 21:33 -0700, Darrick J. Wong wrote:
> >>>>> 
> >>>>> > Hi Aneesh,
> >>>>> > 
> >>>>> > I noticed when trying out 4.7-rc3 on qemu-2.5 that the kernel no longer
> >>>>> > boots.  4.6 booted just fine, so I bisected the kernel to the commit
> >>>>> > 30bda41aba4efb2370c97e2cbe7385de93ccc372, which is "powerpc/mm: Drop WIMG in
> >>>>> > favour of new constants".  The changelog suggests that the KVM changes need
> >>>>> > closer review, and here's an actual crash:
> >>>>> > 
> >>>>> > (I can send libvirt's machine xml, .config, and full dmesg if that helps.)
> >>>>> 
> >>>>> Yes please.
> >>>>> 
> >>>>> I'm successfully booting 4.7-rc's on qemu (2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.1)).
> >>>>
> >>>> Ok, see attached.  I also sent along the dpkg --status output for qemu
> >>>> and qemu-slof; looks like we're running the same Ubuntu packages...
> >>>>
> >>>> ...my host kernel is 4.6.0 on x64.
> >>>
> >>> So this is Qemu TCG mode right ? I will try some test and update later.
> >>>
> >>
> >> I am able to reproduce this with
> >>
> >> qemu-system-ppc64 -kernel vmlinux -machine
> >> type=pseries,usb=off -smp 1 -m 1G  -vga none -nographic    -device
> >> usb-ehci -device usb-kbd -device usb-mouse
> >>
> >> Looks like enabling usb device is the issue.
> >>
> >
> > Hmm Qemu  does
> >
> >         /* Looks like an IO address */
> >         /* FIXME: What WIMG combinations could be sensible for IO?
> >          * For now we allow WIMG=010x, but are there others? */
> >         /* FIXME: Should we check against registered IO addresses? */
> >         if ((ptel & (HPTE64_R_W | HPTE64_R_I | HPTE64_R_M)) != HPTE64_R_I) {
> >             return H_PARAMETER;
> >         }
> >
> 
> 
> Can you try this patch ?
> 
> Ben,
> 
> The pHyp part of the comment was added by you in 
> 3c726f8dee6f55e96475574e9f645327e461884c ([PATCH] ppc64: support 64k
> page) really an old commit. I also remember we having the discussion and
> concluding that it should be safe to assume that we can always enable
> memory coherence. Should we do the below patch of get Qemu fixed up ?
> like below
> 
> -        if ((ptel & (HPTE64_R_W | HPTE64_R_I | HPTE64_R_M)) != HPTE64_R_I) {
> +        wimg_flags = (ptel & (HPTE64_R_W | HPTE64_R_I | HPTE64_R_M));
> +
> +        if (wimg_flags != HPTE64_R_I && wimg_flags != (HPTE64_R_I | HPTE64_R_M)) {
>              return H_PARAMETER;
>          }
> 
> 
> commit 58f32706f64ee8fe21bbd7d6c211720cedec1292
> Author: Aneesh Kumar K.V <aneesh.kumar at linux.vnet.ibm.com>
> Date:   Thu Jun 16 19:43:39 2016 +0530
> 
>     powerpc/mm/hash: Don't add memory coherence if cache inhibited is set
>     
>     H_ENTER hcall handling in qemu had assumptions that a cache inhibited
>     hpte entry won't have memory conference set. Also older kernel

coherence ?                        ^^^^^^^^^^

>     mentioned that some version of pHyp required this (look at the comment
>     removed by the commit mentioned below).
>     
>     Fixes: commit 30bda41aba4e("powerpc/mm: Drop WIMG in favour of new constant")
>     
>     Signed-off-by: Aneesh Kumar K.V <aneesh.kumar at linux.vnet.ibm.com>
> 
> diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
> index fcf676f7f522..89c2791bc510 100644
> --- a/arch/powerpc/mm/hash_utils_64.c
> +++ b/arch/powerpc/mm/hash_utils_64.c
> @@ -201,9 +201,8 @@ unsigned long htab_convert_pte_flags(unsigned long pteflags)
>  	/*
>  	 * We can't allow hardware to update hpte bits. Hence always
>  	 * set 'R' bit and set 'C' if it is a write fault
> -	 * Memory coherence is always enabled
>  	 */
> -	rflags |=  HPTE_R_R | HPTE_R_M;
> +	rflags |=  HPTE_R_R;
>  
>  	if (pteflags & _PAGE_DIRTY)
>  		rflags |= HPTE_R_C;
> @@ -216,7 +215,12 @@ unsigned long htab_convert_pte_flags(unsigned long pteflags)
>  	if ((pteflags & _PAGE_CACHE_CTL ) == _PAGE_NON_IDEMPOTENT)
>  		rflags |= (HPTE_R_I | HPTE_R_G);
>  	if ((pteflags & _PAGE_CACHE_CTL) == _PAGE_SAO)
> -		rflags |= (HPTE_R_I | HPTE_R_W);
> +		rflags |= (HPTE_R_W | HPTE_R_I | HPTE_R_M);
> +	/*
> +	 * Add memory coherence if cache inhibited is not set
> +	 */
> +	if (!(rflags & HPTE_R_I))
> +		rflags |= HPTE_R_M;
>  
>  	return rflags;
>  }
>

In any case, the VM boots again, thank you!

--D


More information about the Linuxppc-dev mailing list