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

[Xen-devel] [PATCH RFC 2/2] x86/mm: PG_translate implies PG_refcounts



After 404595352 ("x86/paging: Enforce PG_external == PG_translate ==
PG_refcounts"), PG_refcounts and PG_translate always need to be set
together.

Squash PG_refcounts to simplify code. All calls paging_mode_refcounts
are replaced by calls to paging_mode_translate.

Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
Cc: Tim Deegan <tim@xxxxxxx>
Cc: Jan Beulich <jbeulich@xxxxxxxx>
Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
 xen/arch/x86/domain.c        |  6 ++----
 xen/arch/x86/hvm/hvm.c       |  2 +-
 xen/arch/x86/mm.c            | 20 ++++++++++----------
 xen/arch/x86/mm/paging.c     |  8 +++-----
 xen/include/asm-x86/paging.h |  5 +----
 xen/include/asm-x86/shadow.h |  2 +-
 6 files changed, 18 insertions(+), 25 deletions(-)

diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 9b4b9596d8..bbe545b165 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1017,8 +1017,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;
@@ -1040,7 +1038,7 @@ int arch_set_info_guest(
             break;
         case 0:
             if ( !compat && !VM_ASSIST(d, m2p_strict) &&
-                 !paging_mode_refcounts(d) )
+                 !paging_mode_translate(d) )
                 fill_ro_mpt(cr3_gfn);
             break;
         default:
@@ -1061,7 +1059,7 @@ int arch_set_info_guest(
 
             if ( !cr3_page )
                 rc = -EINVAL;
-            else if ( !paging_mode_refcounts(d) )
+            else if ( !paging_mode_translate(d) )
             {
                 rc = get_page_type_preemptible(cr3_page, PGT_root_page_table);
                 switch ( rc )
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 6cb903def5..eee0ff422e 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -589,7 +589,7 @@ int hvm_domain_initialise(struct domain *d, unsigned long 
domcr_flags,
 
     hvm_init_cacheattr_region_list(d);
 
-    rc = paging_enable(d, PG_refcounts|PG_translate|PG_external);
+    rc = paging_enable(d, PG_translate|PG_external);
     if ( rc != 0 )
         goto fail0;
 
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index ed77270586..8adb7b6649 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -1925,7 +1925,7 @@ static int mod_l1_entry(l1_pgentry_t *pl1e, l1_pgentry_t 
nl1e,
     if ( unlikely(__copy_from_user(&ol1e, pl1e, sizeof(ol1e)) != 0) )
         return -EFAULT;
 
-    ASSERT(!paging_mode_refcounts(pt_dom));
+    ASSERT(!paging_mode_translate(pt_dom));
 
     if ( l1e_get_flags(nl1e) & _PAGE_PRESENT )
     {
@@ -2257,7 +2257,7 @@ int get_page(struct page_info *page, struct domain 
*domain)
     if ( likely(owner == domain) )
         return 1;
 
-    if ( !paging_mode_refcounts(domain) && !domain->is_dying )
+    if ( !paging_mode_translate(domain) && !domain->is_dying )
         gprintk(XENLOG_INFO,
                 "Error mfn %"PRI_mfn": rd=%d od=%d caf=%08lx taf=%" 
PRtype_info "\n",
                 mfn_x(page_to_mfn(page)), domain->domain_id,
@@ -2719,7 +2719,7 @@ int vcpu_destroy_pagetables(struct vcpu *v)
     if ( mfn )
     {
         page = mfn_to_page(_mfn(mfn));
-        if ( paging_mode_refcounts(v->domain) )
+        if ( paging_mode_translate(v->domain) )
             put_page(page);
         else
             rc = put_page_and_type_preemptible(page);
@@ -2740,7 +2740,7 @@ int vcpu_destroy_pagetables(struct vcpu *v)
         if ( mfn )
         {
             page = mfn_to_page(_mfn(mfn));
-            if ( paging_mode_refcounts(v->domain) )
+            if ( paging_mode_translate(v->domain) )
                 put_page(page);
             else
                 rc = put_page_and_type_preemptible(page);
@@ -2811,7 +2811,7 @@ int new_guest_cr3(unsigned long mfn)
         return 0;
     }
 
-    rc = paging_mode_refcounts(d)
+    rc = paging_mode_translate(d)
          ? (get_page_from_mfn(_mfn(mfn), d) ? 0 : -EINVAL)
          : get_page_and_type_from_mfn(_mfn(mfn), PGT_root_page_table, d, 0, 1);
     switch ( rc )
@@ -2829,7 +2829,7 @@ int new_guest_cr3(unsigned long mfn)
 
     invalidate_shadow_ldt(curr, 0);
 
-    if ( !VM_ASSIST(d, m2p_strict) && !paging_mode_refcounts(d) )
+    if ( !VM_ASSIST(d, m2p_strict) && !paging_mode_translate(d) )
         fill_ro_mpt(mfn);
     curr->arch.guest_table = pagetable_from_pfn(mfn);
     update_cr3(curr);
@@ -2840,7 +2840,7 @@ int new_guest_cr3(unsigned long mfn)
     {
         struct page_info *page = mfn_to_page(_mfn(old_base_mfn));
 
-        if ( paging_mode_refcounts(d) )
+        if ( paging_mode_translate(d) )
             put_page(page);
         else
             switch ( rc = put_page_and_type_preemptible(page) )
@@ -3059,7 +3059,7 @@ long do_mmuext_op(
             if ( (op.cmd - MMUEXT_PIN_L1_TABLE) > (CONFIG_PAGING_LEVELS - 1) )
                 break;
 
-            if ( paging_mode_refcounts(pg_owner) )
+            if ( paging_mode_translate(pg_owner) )
                 break;
 
             page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC);
@@ -3121,7 +3121,7 @@ long do_mmuext_op(
             break;
 
         case MMUEXT_UNPIN_TABLE:
-            if ( paging_mode_refcounts(pg_owner) )
+            if ( paging_mode_translate(pg_owner) )
                 break;
 
             page = get_page_from_gfn(pg_owner, op.arg1.mfn, NULL, P2M_ALLOC);
@@ -3564,7 +3564,7 @@ long do_mmu_update(
             p2m_type_t p2mt;
 
             rc = -EOPNOTSUPP;
-            if ( unlikely(paging_mode_refcounts(pt_owner)) )
+            if ( unlikely(paging_mode_translate(pt_owner)) )
                 break;
 
             xsm_needed |= XSM_MMU_NORMAL_UPDATE;
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
index 75f5fc0024..354d96d4cc 100644
--- a/xen/arch/x86/mm/paging.c
+++ b/xen/arch/x86/mm/paging.c
@@ -839,11 +839,11 @@ int paging_enable(struct domain *d, u32 mode)
     if ( mode & ~PG_MASK )
         return -EINVAL;
 
-    /* All of external|translate|refcounts, or none. */
-    switch ( mode & (PG_external | PG_translate | PG_refcounts) )
+    /* Both of external|translate, or none. */
+    switch ( mode & (PG_external | PG_translate) )
     {
     case 0:
-    case PG_external | PG_translate | PG_refcounts:
+    case PG_external | PG_translate:
         break;
     default:
         return -EINVAL;
@@ -881,8 +881,6 @@ void paging_dump_domain_info(struct domain *d)
             printk("shadow ");
         if ( paging_mode_hap(d) )
             printk("hap ");
-        if ( paging_mode_refcounts(d) )
-            printk("refcounts ");
         if ( paging_mode_log_dirty(d) )
             printk("log_dirty ");
         if ( paging_mode_translate(d) )
diff --git a/xen/include/asm-x86/paging.h b/xen/include/asm-x86/paging.h
index 64bf2f968a..496a80a1ad 100644
--- a/xen/include/asm-x86/paging.h
+++ b/xen/include/asm-x86/paging.h
@@ -47,8 +47,6 @@
 
 /* common paging mode bits */
 #define PG_mode_shift  10 
-/* Refcounts based on shadow tables instead of guest tables */
-#define PG_refcounts   (XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT << PG_mode_shift)
 /* Enable log dirty mode */
 #define PG_log_dirty   (XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY << PG_mode_shift)
 /* Xen does p2m translation, not guest */
@@ -58,13 +56,12 @@
 #define PG_external    (XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL << PG_mode_shift)
 
 /* All paging modes. */
-#define PG_MASK (PG_refcounts | PG_log_dirty | PG_translate | PG_external)
+#define PG_MASK (PG_log_dirty | PG_translate | PG_external)
 
 #define paging_mode_enabled(_d)   (!!(_d)->arch.paging.mode)
 #define paging_mode_shadow(_d)    (!!((_d)->arch.paging.mode & PG_SH_enable))
 #define paging_mode_hap(_d)       (!!((_d)->arch.paging.mode & PG_HAP_enable))
 
-#define paging_mode_refcounts(_d) (!!((_d)->arch.paging.mode & PG_refcounts))
 #define paging_mode_log_dirty(_d) (!!((_d)->arch.paging.mode & PG_log_dirty))
 #define paging_mode_translate(_d) (!!((_d)->arch.paging.mode & PG_translate))
 #define paging_mode_external(_d)  (!!((_d)->arch.paging.mode & PG_external))
diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h
index 678b5d48bb..e0607b9620 100644
--- a/xen/include/asm-x86/shadow.h
+++ b/xen/include/asm-x86/shadow.h
@@ -35,7 +35,7 @@
 
 #define shadow_mode_enabled(_d)    paging_mode_shadow(_d)
 #define shadow_mode_refcounts(_d) (paging_mode_shadow(_d) && \
-                                   paging_mode_refcounts(_d))
+                                   paging_mode_translate(_d))
 #define shadow_mode_log_dirty(_d) (paging_mode_shadow(_d) && \
                                    paging_mode_log_dirty(_d))
 #define shadow_mode_translate(_d) (paging_mode_shadow(_d) && \
-- 
2.11.0


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

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