|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |