[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v1 03/25] xen/x86: complement PG_log_dirty wrapping
We have PG_log_dirty flag to wrap codes about paging log-dirty support. The main entry is paging_domctl(), and tracking its call chain, the following functions needs wrapping too: - xsm_shadow_control - hvm_mapped_guest_frames_mark_dirty - hap_domctl - shadow_domctl - shadow_test_disable - shadow_one_bit_disable - shadow_test_enable - shadow_get_allocation - log_dirty_ops.enable - hap_enable_log_dirty - sh_enable_log_dirty - _toggle_log_dirty - log_dirty_ops.disable - hap_disable_log_dirty - sh_disable_log_dirty - log_dirty_ops.clean - hap_clean_dirty_bitmap - sh_clean_dirty_bitmap - _clean_dirty_bitmap Wrap paging_domctl hypercall-defs with PG_log_dirty and release PG_log_dirty from PV_SHIM_EXCLUSIVE, as PV_SHIM_EXCLUSIVE will be cleaned up in the future. Signed-off-by: Penny Zheng <Penny.Zheng@xxxxxxx> --- xen/arch/x86/domctl.c | 4 ++++ xen/arch/x86/hvm/hvm.c | 2 ++ xen/arch/x86/include/asm/hypercall.h | 2 ++ xen/arch/x86/include/asm/paging.h | 2 +- xen/arch/x86/mm/hap/hap.c | 6 ++++++ xen/arch/x86/mm/shadow/common.c | 8 ++++++++ xen/arch/x86/mm/shadow/none.c | 4 ++++ xen/include/hypercall-defs.c | 4 ++++ xen/include/xsm/xsm.h | 4 ++++ xen/xsm/dummy.c | 2 ++ xen/xsm/flask/hooks.c | 4 ++++ 11 files changed, 41 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index 3044f706de..156c74e07a 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -213,10 +213,14 @@ long arch_do_domctl( { case XEN_DOMCTL_shadow_op: +#if PG_log_dirty ret = paging_domctl(d, &domctl->u.shadow_op, u_domctl, 0); if ( ret == -ERESTART ) return hypercall_create_continuation( __HYPERVISOR_paging_domctl_cont, "h", u_domctl); +#else + ret = -EOPNOTSUPP; +#endif /* PG_log_dirty */ copyback = true; break; diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index cb8ecd050d..ea97815deb 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -2831,6 +2831,7 @@ void hvm_unmap_guest_frame(void *p, bool permanent) put_page(page); } +#if PG_log_dirty void hvm_mapped_guest_frames_mark_dirty(struct domain *d) { struct hvm_write_map *track; @@ -2840,6 +2841,7 @@ void hvm_mapped_guest_frames_mark_dirty(struct domain *d) paging_mark_dirty(d, page_to_mfn(track->page)); spin_unlock(&d->arch.hvm.write_map.lock); } +#endif /* PG_log_dirty */ static void *hvm_map_entry(unsigned long va, bool *writable) { diff --git a/xen/arch/x86/include/asm/hypercall.h b/xen/arch/x86/include/asm/hypercall.h index f6e9e2313b..fac93527ce 100644 --- a/xen/arch/x86/include/asm/hypercall.h +++ b/xen/arch/x86/include/asm/hypercall.h @@ -16,7 +16,9 @@ #include <public/arch-x86/xen-mca.h> /* for do_mca */ #include <asm/paging.h> +#if PG_log_dirty #define __HYPERVISOR_paging_domctl_cont __HYPERVISOR_arch_1 +#endif #ifdef CONFIG_PV void pv_hypercall(struct cpu_user_regs *regs); diff --git a/xen/arch/x86/include/asm/paging.h b/xen/arch/x86/include/asm/paging.h index 173a569610..956b83215c 100644 --- a/xen/arch/x86/include/asm/paging.h +++ b/xen/arch/x86/include/asm/paging.h @@ -55,7 +55,7 @@ #define PG_translate 0 #define PG_external 0 #endif -#if defined(CONFIG_HVM) || !defined(CONFIG_PV_SHIM_EXCLUSIVE) +#if defined(CONFIG_HVM) /* Enable log dirty mode */ #define PG_log_dirty (XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY << PG_mode_shift) #else diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 668a233923..ccbc9128dd 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -189,6 +189,7 @@ out: return rc; } +#if PG_log_dirty /************************************************/ /* HAP LOG DIRTY SUPPORT */ /************************************************/ @@ -254,6 +255,7 @@ static void cf_check hap_clean_dirty_bitmap(struct domain *d) p2m_change_entry_type_global(d, p2m_ram_rw, p2m_ram_logdirty); guest_flush_tlb_mask(d, d->dirty_cpumask); } +#endif /* PG_log_dirty */ /************************************************/ /* HAP SUPPORT FUNCTIONS */ @@ -468,9 +470,11 @@ static bool cf_check flush_tlb(const unsigned long *vcpu_bitmap); void hap_domain_init(struct domain *d) { static const struct log_dirty_ops hap_ops = { +#if PG_log_dirty .enable = hap_enable_log_dirty, .disable = hap_disable_log_dirty, .clean = hap_clean_dirty_bitmap, +#endif }; /* Use HAP logdirty mechanism. */ @@ -662,6 +666,7 @@ out: paging_unlock(d); } +#if PG_log_dirty int hap_domctl(struct domain *d, struct xen_domctl_shadow_op *sc, XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { @@ -692,6 +697,7 @@ int hap_domctl(struct domain *d, struct xen_domctl_shadow_op *sc, return -EINVAL; } } +#endif /* PG_log_dirty */ static const struct paging_mode hap_paging_real_mode; static const struct paging_mode hap_paging_protected_mode; diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 0176e33bc9..f678e7b149 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -69,9 +69,11 @@ const uint8_t sh_type_to_size[] = { DEFINE_PER_CPU(uint32_t,trace_shadow_path_flags); +#if PG_log_dirty static int cf_check sh_enable_log_dirty(struct domain *); static int cf_check sh_disable_log_dirty(struct domain *); static void cf_check sh_clean_dirty_bitmap(struct domain *); +#endif static void cf_check shadow_update_paging_modes(struct vcpu *); @@ -80,9 +82,11 @@ static void cf_check shadow_update_paging_modes(struct vcpu *); int shadow_domain_init(struct domain *d) { static const struct log_dirty_ops sh_ops = { +#if PG_log_dirty .enable = sh_enable_log_dirty, .disable = sh_disable_log_dirty, .clean = sh_clean_dirty_bitmap, +#endif }; INIT_PAGE_LIST_HEAD(&d->arch.paging.shadow.pinned_shadows); @@ -1414,6 +1418,7 @@ int shadow_set_allocation(struct domain *d, unsigned int pages, bool *preempted) return 0; } +#if PG_log_dirty /* Return the size of the shadow pool, rounded up to the nearest MB */ static unsigned int shadow_get_allocation(struct domain *d) { @@ -1422,6 +1427,7 @@ static unsigned int shadow_get_allocation(struct domain *d) return ((pg >> (20 - PAGE_SHIFT)) + ((pg & ((1 << (20 - PAGE_SHIFT)) - 1)) ? 1 : 0)); } +#endif /* PG_log_dirty */ /**************************************************************************/ /* Hash table for storing the guest->shadow mappings. @@ -2958,6 +2964,7 @@ static int shadow_one_bit_enable(struct domain *d, u32 mode) return 0; } +#if PG_log_dirty static int shadow_one_bit_disable(struct domain *d, u32 mode) /* Turn off a single shadow mode feature */ { @@ -3158,6 +3165,7 @@ int shadow_domctl(struct domain *d, } } +#endif /* PG_log_dirty */ /**************************************************************************/ /* Auditing shadow tables */ diff --git a/xen/arch/x86/mm/shadow/none.c b/xen/arch/x86/mm/shadow/none.c index 2a4005a795..6c6971b458 100644 --- a/xen/arch/x86/mm/shadow/none.c +++ b/xen/arch/x86/mm/shadow/none.c @@ -1,6 +1,7 @@ #include <xen/mm.h> #include <asm/shadow.h> +#if PG_log_dirty static int cf_check _toggle_log_dirty(struct domain *d) { ASSERT(is_pv_domain(d)); @@ -11,6 +12,7 @@ static void cf_check _clean_dirty_bitmap(struct domain *d) { ASSERT(is_pv_domain(d)); } +#endif /* PG_log_dirty */ static void cf_check _update_paging_modes(struct vcpu *v) { @@ -21,9 +23,11 @@ int shadow_domain_init(struct domain *d) { /* For HVM set up pointers for safety, then fail. */ static const struct log_dirty_ops sh_none_ops = { +#if PG_log_dirty .enable = _toggle_log_dirty, .disable = _toggle_log_dirty, .clean = _clean_dirty_bitmap, +#endif }; paging_log_dirty_init(d, &sh_none_ops); diff --git a/xen/include/hypercall-defs.c b/xen/include/hypercall-defs.c index a2f2a7fa75..c70f745ac2 100644 --- a/xen/include/hypercall-defs.c +++ b/xen/include/hypercall-defs.c @@ -198,7 +198,9 @@ dm_op(domid_t domid, unsigned int nr_bufs, xen_dm_op_buf_t *bufs) sysctl(xen_sysctl_t *u_sysctl) #endif domctl(xen_domctl_t *u_domctl) +#if PG_log_dirty paging_domctl_cont(xen_domctl_t *u_domctl) +#endif #ifndef CONFIG_PV_SHIM_EXCLUSIVE platform_op(xen_platform_op_t *u_xenpf_op) #endif @@ -294,6 +296,8 @@ dm_op compat do compat do do hypfs_op do do do do do #endif mca do do - - - +#if PG_log_dirty paging_domctl_cont do do do do - +#endif #endif /* !CPPCHECK */ diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h index 9a23d2827c..dad69905c9 100644 --- a/xen/include/xsm/xsm.h +++ b/xen/include/xsm/xsm.h @@ -173,7 +173,9 @@ struct xsm_ops { #ifdef CONFIG_X86 int (*do_mca)(void); +#if PG_log_dirty int (*shadow_control)(struct domain *d, uint32_t op); +#endif int (*mem_sharing_op)(struct domain *d, struct domain *cd, int op); int (*apic)(struct domain *d, int cmd); int (*machine_memory_map)(void); @@ -687,11 +689,13 @@ static inline int xsm_do_mca(xsm_default_t def) return alternative_call(xsm_ops.do_mca); } +#if PG_log_dirty static inline int xsm_shadow_control( xsm_default_t def, struct domain *d, uint32_t op) { return alternative_call(xsm_ops.shadow_control, d, op); } +#endif static inline int xsm_mem_sharing_op( xsm_default_t def, struct domain *d, struct domain *cd, int op) diff --git a/xen/xsm/dummy.c b/xen/xsm/dummy.c index 8b7e01b506..8a893c6eee 100644 --- a/xen/xsm/dummy.c +++ b/xen/xsm/dummy.c @@ -132,7 +132,9 @@ static const struct xsm_ops __initconst_cf_clobber dummy_ops = { .platform_op = xsm_platform_op, #ifdef CONFIG_X86 .do_mca = xsm_do_mca, +#if PG_log_dirty .shadow_control = xsm_shadow_control, +#endif .mem_sharing_op = xsm_mem_sharing_op, .apic = xsm_apic, .machine_memory_map = xsm_machine_memory_map, diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c index b0308e1b26..0382182f94 100644 --- a/xen/xsm/flask/hooks.c +++ b/xen/xsm/flask/hooks.c @@ -1605,6 +1605,7 @@ static int cf_check flask_do_mca(void) return domain_has_xen(current->domain, XEN__MCA_OP); } +#if PG_log_dirty static int cf_check flask_shadow_control(struct domain *d, uint32_t op) { uint32_t perm; @@ -1631,6 +1632,7 @@ static int cf_check flask_shadow_control(struct domain *d, uint32_t op) return current_has_perm(d, SECCLASS_SHADOW, perm); } +#endif /* PG_log_dirty */ struct ioport_has_perm_data { uint32_t ssid; @@ -2003,7 +2005,9 @@ static const struct xsm_ops __initconst_cf_clobber flask_ops = { .platform_op = flask_platform_op, #ifdef CONFIG_X86 .do_mca = flask_do_mca, +#if PG_log_dirty .shadow_control = flask_shadow_control, +#endif .mem_sharing_op = flask_mem_sharing_op, .apic = flask_apic, .machine_memory_map = flask_machine_memory_map, -- 2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |