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