Mailing List Archive

[xen staging] x86/PV: drop a few misleading paging_mode_refcounts() checks
commit cb79dc100fae7295009118ae10efe7822d5be2af
Author: Jan Beulich <jbeulich@suse.com>
AuthorDate: Fri Jul 31 17:40:13 2020 +0200
Commit: Jan Beulich <jbeulich@suse.com>
CommitDate: Fri Jul 31 17:40:13 2020 +0200

x86/PV: drop a few misleading paging_mode_refcounts() checks

The filling and cleaning up of v->arch.guest_table in new_guest_cr3()
was apparently inconsistent so far: There was a type ref acquired
unconditionally for the new top level page table, but the dropping of
the old type ref was conditional upon !paging_mode_refcounts(). Mirror
this also to arch_set_info_guest().

Also move new_guest_cr3()'s #ifdef to around the function - both callers
now get built only when CONFIG_PV, i.e. no need to retain a stub.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Tim Deegan <tim@xen.org>
Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
xen/arch/x86/domain.c | 7 ++-----
xen/arch/x86/mm.c | 38 ++++++++++++++++----------------------
2 files changed, 18 insertions(+), 27 deletions(-)

diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index fee6c3931a..f8084dc9e3 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1122,8 +1122,6 @@ int arch_set_info_guest(

if ( !cr3_page )
rc = -EINVAL;
- else if ( paging_mode_refcounts(d) )
- /* nothing */;
else if ( cr3_page == v->arch.old_guest_table )
{
v->arch.old_guest_table = NULL;
@@ -1144,8 +1142,7 @@ int arch_set_info_guest(
case -ERESTART:
break;
case 0:
- if ( !compat && !VM_ASSIST(d, m2p_strict) &&
- !paging_mode_refcounts(d) )
+ if ( !compat && !VM_ASSIST(d, m2p_strict) )
fill_ro_mpt(cr3_mfn);
break;
default:
@@ -1166,7 +1163,7 @@ int arch_set_info_guest(

if ( !cr3_page )
rc = -EINVAL;
- else if ( !paging_mode_refcounts(d) )
+ else
{
rc = get_page_type_preemptible(cr3_page, PGT_root_page_table);
switch ( rc )
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 82bc676553..638f6bf580 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -3149,9 +3149,9 @@ int vcpu_destroy_pagetables(struct vcpu *v)
return rc;
}

+#ifdef CONFIG_PV
int new_guest_cr3(mfn_t mfn)
{
-#ifdef CONFIG_PV
struct vcpu *curr = current;
struct domain *d = curr->domain;
int rc;
@@ -3220,7 +3220,7 @@ int new_guest_cr3(mfn_t mfn)

pv_destroy_ldt(curr); /* Unconditional TLB flush later. */

- if ( !VM_ASSIST(d, m2p_strict) && !paging_mode_refcounts(d) )
+ if ( !VM_ASSIST(d, m2p_strict) )
fill_ro_mpt(mfn);
curr->arch.guest_table = pagetable_from_mfn(mfn);
update_cr3(curr);
@@ -3231,30 +3231,24 @@ int new_guest_cr3(mfn_t mfn)
{
struct page_info *page = mfn_to_page(old_base_mfn);

- if ( paging_mode_refcounts(d) )
- put_page(page);
- else
- switch ( rc = put_page_and_type_preemptible(page) )
- {
- case -EINTR:
- case -ERESTART:
- curr->arch.old_guest_ptpg = NULL;
- curr->arch.old_guest_table = page;
- curr->arch.old_guest_table_partial = (rc == -ERESTART);
- rc = -ERESTART;
- break;
- default:
- BUG_ON(rc);
- break;
- }
+ switch ( rc = put_page_and_type_preemptible(page) )
+ {
+ case -EINTR:
+ case -ERESTART:
+ curr->arch.old_guest_ptpg = NULL;
+ curr->arch.old_guest_table = page;
+ curr->arch.old_guest_table_partial = (rc == -ERESTART);
+ rc = -ERESTART;
+ break;
+ default:
+ BUG_ON(rc);
+ break;
+ }
}

return rc;
-#else
- ASSERT_UNREACHABLE();
- return -EINVAL;
-#endif
}
+#endif

#ifdef CONFIG_PV
static int vcpumask_to_pcpumask(
--
generated by git-patchbot for /home/xen/git/xen.git#staging