[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [SHADOW] Clean up the DOM0_SHADOW_OP interface.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Node ID 0ea9a824c16c2a99fd803bcdc28f165c9de4b072 # Parent 92066b3fcd86457df3920d021f8b7f07322a46e3 [SHADOW] Clean up the DOM0_SHADOW_OP interface. Also bump the dom0 interface version for tools (but not for dom0 kernel!). Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- tools/libxc/xc_hvm_build.c | 11 ++-- tools/libxc/xc_linux_save.c | 6 -- tools/python/xen/lowlevel/xc/xc.c | 4 - xen/arch/ia64/xen/domain.c | 5 -- xen/arch/x86/shadow2-common.c | 42 ++++++++--------- xen/common/dom0_ops.c | 3 - xen/include/asm-x86/shadow2.h | 10 ++-- xen/include/public/dom0_ops.h | 89 ++++++++++++++++++++++++++------------ 8 files changed, 99 insertions(+), 71 deletions(-) diff -r 92066b3fcd86 -r 0ea9a824c16c tools/libxc/xc_hvm_build.c --- a/tools/libxc/xc_hvm_build.c Tue Aug 22 18:48:00 2006 +0100 +++ b/tools/libxc/xc_hvm_build.c Tue Aug 22 18:50:01 2006 +0100 @@ -442,13 +442,12 @@ static int xc_hvm_build_internal(int xc_ } /* HVM domains must be put into shadow2 mode at the start of day */ - if ( xc_shadow_control(xc_handle, domid, DOM0_SHADOW2_CONTROL_OP_ENABLE, + if ( xc_shadow_control(xc_handle, domid, DOM0_SHADOW_CONTROL_OP_ENABLE, NULL, 0, NULL, - DOM0_SHADOW2_CONTROL_FLAG_ENABLE - | DOM0_SHADOW2_CONTROL_FLAG_REFCOUNT - | DOM0_SHADOW2_CONTROL_FLAG_TRANSLATE - | DOM0_SHADOW2_CONTROL_FLAG_EXTERNAL, - NULL) ) + DOM0_SHADOW_ENABLE_REFCOUNT | + DOM0_SHADOW_ENABLE_TRANSLATE | + DOM0_SHADOW_ENABLE_EXTERNAL, + NULL) ) { PERROR("Could not enable shadow paging for domain.\n"); goto error_out; diff -r 92066b3fcd86 -r 0ea9a824c16c tools/libxc/xc_linux_save.c --- a/tools/libxc/xc_linux_save.c Tue Aug 22 18:48:00 2006 +0100 +++ b/tools/libxc/xc_linux_save.c Tue Aug 22 18:50:01 2006 +0100 @@ -346,11 +346,9 @@ static int analysis_phase(int xc_handle, xc_shadow_control(xc_handle, domid, DOM0_SHADOW_CONTROL_OP_PEEK, NULL, 0, NULL, 0, &stats); - DPRINTF("now= %lld faults= %" PRId32 " dirty= %" PRId32 - " dirty_net= %" PRId32 " dirty_block= %" PRId32"\n", + DPRINTF("now= %lld faults= %"PRId32" dirty= %"PRId32"\n", ((now-start)+500)/1000, - stats.fault_count, stats.dirty_count, - stats.dirty_net_count, stats.dirty_block_count); + stats.fault_count, stats.dirty_count); } } diff -r 92066b3fcd86 -r 0ea9a824c16c tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Tue Aug 22 18:48:00 2006 +0100 +++ b/tools/python/xen/lowlevel/xc/xc.c Tue Aug 22 18:50:01 2006 +0100 @@ -709,11 +709,11 @@ static PyObject *pyxc_shadow_mem_control return NULL; if ( mbarg < 0 ) - op = DOM0_SHADOW2_CONTROL_OP_GET_ALLOCATION; + op = DOM0_SHADOW_CONTROL_OP_GET_ALLOCATION; else { mb = mbarg; - op = DOM0_SHADOW2_CONTROL_OP_SET_ALLOCATION; + op = DOM0_SHADOW_CONTROL_OP_SET_ALLOCATION; } if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, &mb, 0, NULL) < 0 ) return PyErr_SetFromErrno(xc_error); diff -r 92066b3fcd86 -r 0ea9a824c16c xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Tue Aug 22 18:48:00 2006 +0100 +++ b/xen/arch/ia64/xen/domain.c Tue Aug 22 18:50:01 2006 +0100 @@ -653,11 +653,6 @@ int shadow_mode_control(struct domain *d } break; - case DOM0_SHADOW_CONTROL_OP_FLUSH: - atomic64_set(&d->arch.shadow_fault_count, 0); - atomic64_set(&d->arch.shadow_dirty_count, 0); - break; - case DOM0_SHADOW_CONTROL_OP_CLEAN: { int nbr_longs; diff -r 92066b3fcd86 -r 0ea9a824c16c xen/arch/x86/shadow2-common.c --- a/xen/arch/x86/shadow2-common.c Tue Aug 22 18:48:00 2006 +0100 +++ b/xen/arch/x86/shadow2-common.c Tue Aug 22 18:50:01 2006 +0100 @@ -2481,14 +2481,15 @@ static int shadow2_enable(struct domain unsigned int old_pages; int rv = 0; + mode |= SHM2_enable; + domain_pause(d); shadow2_lock(d); /* Sanity check the arguments */ - if ( d == current->domain - || shadow2_mode_enabled(d) - || !(mode & SHM2_enable) - || ((mode & SHM2_external) && !(mode & SHM2_translate)) ) + if ( (d == current->domain) || + shadow2_mode_enabled(d) || + ((mode & SHM2_external) && !(mode & SHM2_translate)) ) { rv = -EINVAL; goto out; @@ -2957,11 +2958,7 @@ static int shadow2_log_dirty_op(struct d domain_pause(d); shadow2_lock(d); - if ( sc->op == DOM0_SHADOW_CONTROL_OP_CLEAN - || sc->op == DOM0_SHADOW_CONTROL_OP_FLUSH ) - clean = 1; - else - ASSERT(sc->op == DOM0_SHADOW_CONTROL_OP_PEEK); + clean = (sc->op == DOM0_SHADOW_CONTROL_OP_CLEAN); SHADOW2_DEBUG(LOGDIRTY, "log-dirty %s: dom %u faults=%u dirty=%u\n", (clean) ? "clean" : "peek", @@ -3111,25 +3108,27 @@ int shadow2_control_op(struct domain *d, case DOM0_SHADOW_CONTROL_OP_ENABLE_TEST: return shadow2_test_enable(d); - + case DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY: return shadow2_log_dirty_enable(d); - - case DOM0_SHADOW_CONTROL_OP_FLUSH: + + case DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE: + return shadow2_enable(d, SHM2_refcounts|SHM2_translate); + case DOM0_SHADOW_CONTROL_OP_CLEAN: case DOM0_SHADOW_CONTROL_OP_PEEK: return shadow2_log_dirty_op(d, sc); - - - case DOM0_SHADOW2_CONTROL_OP_ENABLE: - return shadow2_enable(d, sc->mode << SHM2_shift); - - case DOM0_SHADOW2_CONTROL_OP_GET_ALLOCATION: + case DOM0_SHADOW_CONTROL_OP_ENABLE: + if ( sc->mode & DOM0_SHADOW_ENABLE_LOG_DIRTY ) + return shadow2_log_dirty_enable(d); + return shadow2_enable(d, sc->mode << SHM2_shift); + + case DOM0_SHADOW_CONTROL_OP_GET_ALLOCATION: sc->mb = shadow2_get_allocation(d); return 0; - - case DOM0_SHADOW2_CONTROL_OP_SET_ALLOCATION: + + case DOM0_SHADOW_CONTROL_OP_SET_ALLOCATION: rc = shadow2_set_allocation(d, sc->mb, &preempted); if ( preempted ) /* Not finished. Set up to re-run the call. */ @@ -3139,8 +3138,7 @@ int shadow2_control_op(struct domain *d, /* Finished. Return the new allocation */ sc->mb = shadow2_get_allocation(d); return rc; - - + default: SHADOW2_ERROR("Bad shadow op %u\n", sc->op); return -EINVAL; diff -r 92066b3fcd86 -r 0ea9a824c16c xen/common/dom0_ops.c --- a/xen/common/dom0_ops.c Tue Aug 22 18:48:00 2006 +0100 +++ b/xen/common/dom0_ops.c Tue Aug 22 18:50:01 2006 +0100 @@ -141,7 +141,8 @@ long do_dom0_op(XEN_GUEST_HANDLE(dom0_op if ( copy_from_guest(op, u_dom0_op, 1) ) return -EFAULT; - if ( op->interface_version != DOM0_INTERFACE_VERSION ) + if ( (op->interface_version != DOM0_TOOLS_INTERFACE_VERSION) && + (op->interface_version != DOM0_KERNEL_INTERFACE_VERSION) ) return -EACCES; if ( acm_pre_dom0_op(op, &ssid) ) diff -r 92066b3fcd86 -r 0ea9a824c16c xen/include/asm-x86/shadow2.h --- a/xen/include/asm-x86/shadow2.h Tue Aug 22 18:48:00 2006 +0100 +++ b/xen/include/asm-x86/shadow2.h Tue Aug 22 18:50:01 2006 +0100 @@ -32,16 +32,16 @@ #define SHM2_shift 10 /* We're in one of the shadow modes */ -#define SHM2_enable (DOM0_SHADOW2_CONTROL_FLAG_ENABLE << SHM2_shift) +#define SHM2_enable (1U << SHM2_shift) /* Refcounts based on shadow tables instead of guest tables */ -#define SHM2_refcounts (DOM0_SHADOW2_CONTROL_FLAG_REFCOUNT << SHM2_shift) +#define SHM2_refcounts (DOM0_SHADOW_ENABLE_REFCOUNT << SHM2_shift) /* Enable log dirty mode */ -#define SHM2_log_dirty (DOM0_SHADOW2_CONTROL_FLAG_LOG_DIRTY << SHM2_shift) +#define SHM2_log_dirty (DOM0_SHADOW_ENABLE_LOG_DIRTY << SHM2_shift) /* Xen does p2m translation, not guest */ -#define SHM2_translate (DOM0_SHADOW2_CONTROL_FLAG_TRANSLATE << SHM2_shift) +#define SHM2_translate (DOM0_SHADOW_ENABLE_TRANSLATE << SHM2_shift) /* Xen does not steal address space from the domain for its own booking; * requires VT or similar mechanisms */ -#define SHM2_external (DOM0_SHADOW2_CONTROL_FLAG_EXTERNAL << SHM2_shift) +#define SHM2_external (DOM0_SHADOW_ENABLE_EXTERNAL << SHM2_shift) #define shadow2_mode_enabled(_d) ((_d)->arch.shadow2.mode) #define shadow2_mode_refcounts(_d) ((_d)->arch.shadow2.mode & SHM2_refcounts) diff -r 92066b3fcd86 -r 0ea9a824c16c xen/include/public/dom0_ops.h --- a/xen/include/public/dom0_ops.h Tue Aug 22 18:48:00 2006 +0100 +++ b/xen/include/public/dom0_ops.h Tue Aug 22 18:50:01 2006 +0100 @@ -18,8 +18,19 @@ * Make sure you increment the interface version whenever you modify this file! * This makes sure that old versions of dom0 tools will stop working in a * well-defined way (rather than crashing the machine, for instance). - */ -#define DOM0_INTERFACE_VERSION 0x03000001 + * + * Separate kernel from tools as the kernel uses a small subset of the dom0 + * operations and so it is unnecessary to break backward compatibility so + * often. + */ +#define DOM0_TOOLS_INTERFACE_VERSION 0x13000001 +#define DOM0_KERNEL_INTERFACE_VERSION 0x03000001 + +#ifdef __XEN_TOOLS__ +#define DOM0_INTERFACE_VERSION DOM0_TOOLS_INTERFACE_VERSION +#else +#define DOM0_INTERFACE_VERSION DOM0_KERNEL_INTERFACE_VERSION +#endif /************************************************************************/ @@ -253,32 +264,54 @@ DEFINE_XEN_GUEST_HANDLE(dom0_sched_id_t) */ #define DOM0_SHADOW_CONTROL 25 +/* Disable shadow mode. */ #define DOM0_SHADOW_CONTROL_OP_OFF 0 -#define DOM0_SHADOW_CONTROL_OP_ENABLE_TEST 1 -#define DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY 2 -#define DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE 3 - -#define DOM0_SHADOW_CONTROL_OP_FLUSH 10 /* table ops */ + +/* Enable shadow mode (mode contains ORed DOM0_SHADOW_ENABLE_* flags). */ +#define DOM0_SHADOW_CONTROL_OP_ENABLE 32 + +/* Log-dirty bitmap operations. */ + /* Return the bitmap and clean internal copy for next round. */ #define DOM0_SHADOW_CONTROL_OP_CLEAN 11 + /* Return the bitmap but do not modify internal copy. */ #define DOM0_SHADOW_CONTROL_OP_PEEK 12 -/* Shadow2 operations */ -#define DOM0_SHADOW2_CONTROL_OP_GET_ALLOCATION 30 -#define DOM0_SHADOW2_CONTROL_OP_SET_ALLOCATION 31 -#define DOM0_SHADOW2_CONTROL_OP_ENABLE 32 - -/* Mode flags for Shadow2 enable op */ -#define DOM0_SHADOW2_CONTROL_FLAG_ENABLE (1 << 0) -#define DOM0_SHADOW2_CONTROL_FLAG_REFCOUNT (1 << 1) -#define DOM0_SHADOW2_CONTROL_FLAG_LOG_DIRTY (1 << 2) -#define DOM0_SHADOW2_CONTROL_FLAG_TRANSLATE (1 << 3) -#define DOM0_SHADOW2_CONTROL_FLAG_EXTERNAL (1 << 4) +/* Memory allocation accessors. */ +#define DOM0_SHADOW_CONTROL_OP_GET_ALLOCATION 30 +#define DOM0_SHADOW_CONTROL_OP_SET_ALLOCATION 31 + +/* Legacy enable operations. */ + /* Equiv. to ENABLE with no mode flags. */ +#define DOM0_SHADOW_CONTROL_OP_ENABLE_TEST 1 + /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */ +#define DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY 2 + /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */ +#define DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE 3 + +/* Mode flags for DOM0_SHADOW_CONTROL_OP_ENABLE. */ + /* + * Shadow pagetables are refcounted: guest does not use explicit mmu + * operations nor write-protect its pagetables. + */ +#define DOM0_SHADOW_ENABLE_REFCOUNT (1 << 1) + /* + * Log pages in a bitmap as they are dirtied. + * Used for live relocation to determine which pages must be re-sent. + */ +#define DOM0_SHADOW_ENABLE_LOG_DIRTY (1 << 2) + /* + * Automatically translate GPFNs into MFNs. + */ +#define DOM0_SHADOW_ENABLE_TRANSLATE (1 << 3) + /* + * Xen does not steal virtual address space from the guest. + * Requires HVM support. + */ +#define DOM0_SHADOW_ENABLE_EXTERNAL (1 << 4) struct dom0_shadow_control_stats { uint32_t fault_count; uint32_t dirty_count; - uint32_t dirty_net_count; - uint32_t dirty_block_count; }; typedef struct dom0_shadow_control_stats dom0_shadow_control_stats_t; DEFINE_XEN_GUEST_HANDLE(dom0_shadow_control_stats_t); @@ -286,13 +319,17 @@ struct dom0_shadow_control { struct dom0_shadow_control { /* IN variables. */ domid_t domain; - uint32_t op; + uint32_t op; /* DOM0_SHADOW_CONTROL_OP_* */ + + /* OP_ENABLE */ + uint32_t mode; /* DOM0_SHADOW_ENABLE_* */ + + /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */ + uint32_t mb; /* Shadow memory allocation in MB */ + + /* OP_PEEK / OP_CLEAN */ XEN_GUEST_HANDLE(ulong) dirty_bitmap; - /* IN/OUT variables. */ - uint64_t pages; /* size of buffer, updated with actual size */ - uint32_t mb; /* Shadow2 memory allocation in MB */ - uint32_t mode; /* Shadow2 mode to enable */ - /* OUT variables. */ + uint64_t pages; /* Size of buffer. Updated with actual size. */ struct dom0_shadow_control_stats stats; }; typedef struct dom0_shadow_control dom0_shadow_control_t; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |