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 when
>   finding the vm_page_t in pmap_extract_and_hold. Previously it would return
>   the vm_page_t of the first page in a block. This would cause issues when,
>   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 not to
>   the buffer passed in.
>   
>   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
> ==============================================================================
> --- 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) == ATTR_AP(ATTR_AP_RW)) ||
>                   ((prot & VM_PROT_WRITE) == 0)) {
> +                     switch(lvl) {
> +                     case 1:
> +                             off = va & L1_OFFSET;
> +                             break;
> +                     case 2:
> +                             off = va & L2_OFFSET;
> +                             break;
> +                     case 3:
> +                     default:
> +                             off = 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 = PHYS_TO_VM_PAGE(tpte & ~ATTR_MASK);
> +                     m = PHYS_TO_VM_PAGE((tpte & ~ATTR_MASK) | off);
>                       vm_page_hold(m);
>               }
>       }
>
>


_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to