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>