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

Re: [Xen-devel] [PATCH] x86/pv: Clean up cr3 handling in arch_set_info_guest()



On Fri, Dec 21, 2018 at 01:46:05PM +0000, Andrew Cooper wrote:
> All of this code lives inside CONFIG_PV which means gfn == mfn, and the
> fill_ro_mpt() calls clearly show that the value is used untranslated.
> 
> Change cr3_gfn to a suitably typed cr3_mfn, and replace get_page_from_gfn()
> with a straight mfn_to_page/get_page sequence, to avoid the implication that
> translation is going on.
> 
> No functional change.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> CC: Julien Grall <julien.grall@xxxxxxx>
> 
> Julien: This should simplify your "xen: Switch parameter in get_page_from_gfn
> to use typesafe gfn" patch.  In particular, I did a doubletake at
> fill_ro_mpt(_mfn(gfn_x(cr3_gfn))); when reviewing it.
> ---
>  xen/arch/x86/domain.c | 22 +++++++++++-----------
>  1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index 32dc4253..da94ab4 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -827,8 +827,8 @@ int arch_set_info_guest(
>      unsigned long flags;
>      bool compat;
>  #ifdef CONFIG_PV
> -    unsigned long cr3_gfn;
> -    struct page_info *cr3_page;
> +    mfn_t cr3_mfn;
> +    struct page_info *cr3_page = NULL;
>      unsigned long cr4;
>      int rc = 0;
>  #endif
> @@ -1091,12 +1091,12 @@ int arch_set_info_guest(
>      set_bit(_VPF_in_reset, &v->pause_flags);
>  
>      if ( !compat )
> -        cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[3]);
> +        cr3_mfn = _mfn(xen_cr3_to_pfn(c.nat->ctrlreg[3]));
>      else
> -        cr3_gfn = compat_cr3_to_pfn(c.cmp->ctrlreg[3]);
> -    cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
> +        cr3_mfn = _mfn(compat_cr3_to_pfn(c.cmp->ctrlreg[3]));
>  
> -    if ( !cr3_page )
> +    if ( !mfn_valid(cr3_mfn) ||
> +         !(cr3_page = mfn_to_page(cr3_mfn), get_page(cr3_page, d)) )

This is kind of an open-coded version of get_page_from_gfn with just
the non-paging bits, IMO I would use get_page_from_gfn, or introduce a
get_page_from_mfn helper?

The more that you use the same construct below.

>          rc = -EINVAL;
>      else if ( paging_mode_refcounts(d) )
>          /* nothing */;
> @@ -1122,7 +1122,7 @@ int arch_set_info_guest(
>          case 0:
>              if ( !compat && !VM_ASSIST(d, m2p_strict) &&
>                   !paging_mode_refcounts(d) )
> -                fill_ro_mpt(_mfn(cr3_gfn));
> +                fill_ro_mpt(cr3_mfn);
>              break;
>          default:
>              if ( cr3_page == current->arch.old_guest_table )
> @@ -1137,10 +1137,10 @@ int arch_set_info_guest(
>          v->arch.guest_table = pagetable_from_page(cr3_page);
>          if ( c.nat->ctrlreg[1] )
>          {
> -            cr3_gfn = xen_cr3_to_pfn(c.nat->ctrlreg[1]);
> -            cr3_page = get_page_from_gfn(d, cr3_gfn, NULL, P2M_ALLOC);
> +            cr3_mfn = _mfn(xen_cr3_to_pfn(c.nat->ctrlreg[1]));

I assume this is something PV specific, but calling xen_cr3_to_pfn on
ctrlreg[1] seems wrong at first sight. And the xen_cr3_to_pfn and
xen_pfn_to_cr3 helpers seem quite pointless, since it's just PFN_DOWN
or pfn_to_paddr.

Thanks, Roger.

_______________________________________________
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®.