Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 23 Aug 2016 11:17:24 -0500
From:      Alan Cox <alc@rice.edu>
To:        Andrew Turner <andrew@FreeBSD.org>, src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r304685 - head/sys/arm64/arm64
Message-ID:  <89eccc71-ec8a-545b-c212-387580b10965@rice.edu>
In-Reply-To: <201608231548.u7NFmRuP041148@repo.freebsd.org>
References:  <201608231548.u7NFmRuP041148@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On 08/23/2016 10:48, Andrew Turner wrote:
> Author: andrew
> Date: Tue Aug 23 15:48:27 2016
> New Revision: 304685
> URL: https://svnweb.freebsd.org/changeset/base/304685
>
> Log:
>   Include the offset the virtual address is within an L1 or L2 block wh=
en
>   finding the vm_page_t in pmap_extract_and_hold. Previously it would r=
eturn
>   the vm_page_t of the first page in a block. This would cause issues w=
hen,
>   for example, fsck reads from a device into the middle of a superpage.=
 In
>   this case the read call would write to the start of the block, and no=
t to
>   the buffer passed in.
>  =20
>   Obtained from:	ABT Systems Ltd
>   MFC after:	1 month
>   Sponsored by:	The FreeBSD Foundation
>
> Modified:
>   head/sys/arm64/arm64/pmap.c
>
> Modified: head/sys/arm64/arm64/pmap.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
> --- head/sys/arm64/arm64/pmap.c	Tue Aug 23 15:46:20 2016	(r304684)
> +++ head/sys/arm64/arm64/pmap.c	Tue Aug 23 15:48:27 2016	(r304685)
> @@ -995,6 +995,7 @@ vm_page_t
>  pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
>  {
>  	pt_entry_t *pte, tpte;
> +	vm_offset_t off;
>  	vm_paddr_t pa;
>  	vm_page_t m;
>  	int lvl;
> @@ -1016,9 +1017,20 @@ retry:
>  		     tpte & ATTR_DESCR_MASK));
>  		if (((tpte & ATTR_AP_RW_BIT) =3D=3D ATTR_AP(ATTR_AP_RW)) ||
>  		    ((prot & VM_PROT_WRITE) =3D=3D 0)) {
> +			switch(lvl) {
> +			case 1:
> +				off =3D va & L1_OFFSET;
> +				break;
> +			case 2:
> +				off =3D va & L2_OFFSET;
> +				break;
> +			case 3:
> +			default:
> +				off =3D 0;
> +			}

I would strongly suggest that you also include the page offset in the
value passed to vm_page_pa_tryrelock().  Otherwise, if we ever change
the mapping from physical addresses to page locks, this code will be
acquiring the wrong lock.  Other pmap implementations, e.g., amd64, do
include the offset.

>  			if (vm_page_pa_tryrelock(pmap, tpte & ~ATTR_MASK, &pa))
>  				goto retry;
> -			m =3D PHYS_TO_VM_PAGE(tpte & ~ATTR_MASK);
> +			m =3D PHYS_TO_VM_PAGE((tpte & ~ATTR_MASK) | off);
>  			vm_page_hold(m);
>  		}
>  	}
>
>





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?89eccc71-ec8a-545b-c212-387580b10965>