[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH MM-PART3 v2 07/12] xen/arm: mm: Rework xen_pt_update_entry to avoid use xenmap_operation



On Tue, 14 May 2019, Julien Grall wrote:
> With the newly introduced flags, it is now possible to know how the page
> will be updated through the flags.
> 
> All the use of xenmap_operation are now replaced with the flags. At the
> same time, validity check are now removed as they are gathered in
> xen_pt_check_entry().
> 
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
> Reviewed-by: Andrii Anisov <andrii_anisov@xxxxxxxx>

Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>


> ---
> 
>     Changes in v2:
>         - Fix typo in the commit message
>         - Add Andrii's reviewed-by
> ---
>  xen/arch/arm/mm.c | 47 +++++++++++++++++++++++------------------------
>  1 file changed, 23 insertions(+), 24 deletions(-)
> 
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 45a6f9287f..86e1faeeb5 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -1067,34 +1067,33 @@ static int xen_pt_update_entry(enum xenmap_operation 
> op, unsigned long addr,
>      if ( !xen_pt_check_entry(*entry, mfn, flags) )
>          return -EINVAL;
>  
> -    switch ( op ) {
> -        case INSERT:
> -        case RESERVE:
> -            if ( op == RESERVE )
> -                break;
> +    /* If we are only populating page-table, then we are done. */
> +    if ( flags & _PAGE_POPULATE )
> +        return 0;
> +
> +    /* We are removing the page */
> +    if ( !(flags & _PAGE_PRESENT) )
> +        memset(&pte, 0x00, sizeof(pte));
> +    else
> +    {
> +        /* We are inserting a mapping => Create new pte. */
> +        if ( !mfn_eq(mfn, INVALID_MFN) )
> +        {
>              pte = mfn_to_xen_entry(mfn, PAGE_AI_MASK(flags));
> -            pte.pt.ro = PAGE_RO_MASK(flags);
> -            pte.pt.xn = PAGE_XN_MASK(flags);
> -            BUG_ON(!pte.pt.ro && !pte.pt.xn);
> +
> +            /* Third level entries set pte.pt.table = 1 */
>              pte.pt.table = 1;
> -            write_pte(entry, pte);
> -            break;
> -        case MODIFY:
> -        case REMOVE:
> -            if ( op == REMOVE )
> -                pte.bits = 0;
> -            else
> -            {
> -                pte = *entry;
> -                pte.pt.ro = PAGE_RO_MASK(flags);
> -                pte.pt.xn = PAGE_XN_MASK(flags);
> -            }
> -            write_pte(entry, pte);
> -            break;
> -        default:
> -            BUG();
> +        }
> +        else /* We are updating the permission => Copy the current pte. */
> +            pte = *entry;
> +
> +        /* Set permission */
> +        pte.pt.ro = PAGE_RO_MASK(flags);
> +        pte.pt.xn = PAGE_XN_MASK(flags);
>      }
>  
> +    write_pte(entry, pte);
> +
>      return 0;
>  }
>  
> -- 
> 2.11.0
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.