[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH-for-4.9 v1 3/8] dm_op: convert HVMOP_track_dirty_vram
The patch changes the handle type passed to the underlying shadow and hap functions for compatibility with the new hypercall buffer. Suggested-by: Jan Beulich <jbeulich@xxxxxxxx> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- Cc: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Cc: Wei Liu <wei.liu2@xxxxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx> Cc: Tim Deegan <tim@xxxxxxx> --- tools/flask/policy/modules/xen.if | 4 ++-- tools/libxc/xc_misc.c | 31 ++++++++------------------ xen/arch/x86/hvm/dm.c | 43 +++++++++++++++++++++++++++++++++++-- xen/arch/x86/hvm/hvm.c | 41 ----------------------------------- xen/arch/x86/mm/hap/hap.c | 2 +- xen/arch/x86/mm/shadow/common.c | 2 +- xen/include/asm-x86/hap.h | 2 +- xen/include/asm-x86/shadow.h | 2 +- xen/include/public/hvm/dm_op.h | 16 ++++++++++++++ xen/include/public/hvm/hvm_op.h | 4 ++++ xen/xsm/flask/hooks.c | 3 --- xen/xsm/flask/policy/access_vectors | 2 -- 12 files changed, 76 insertions(+), 76 deletions(-) diff --git a/tools/flask/policy/modules/xen.if b/tools/flask/policy/modules/xen.if index 779232e..366273e 100644 --- a/tools/flask/policy/modules/xen.if +++ b/tools/flask/policy/modules/xen.if @@ -58,7 +58,7 @@ define(`create_domain_common', ` allow $1 $2:mmu { map_read map_write adjust memorymap physmap pinpage mmuext_op updatemp }; allow $1 $2:grant setup; allow $1 $2:hvm { cacheattr getparam hvmctl irqlevel pciroute sethvmc - setparam pcilevel trackdirtyvram nested altp2mhvm altp2mhvm_op }; + setparam pcilevel nested altp2mhvm altp2mhvm_op }; ') # create_domain(priv, target) @@ -151,7 +151,7 @@ define(`device_model', ` allow $1 $2_target:domain { getdomaininfo shutdown }; allow $1 $2_target:mmu { map_read map_write adjust physmap target_hack }; - allow $1 $2_target:hvm { getparam setparam trackdirtyvram hvmctl irqlevel pciroute pcilevel cacheattr send_irq dm }; + allow $1 $2_target:hvm { getparam setparam hvmctl irqlevel pciroute pcilevel cacheattr send_irq dm }; ') # make_device_model(priv, dm_dom, hvm_dom) diff --git a/tools/libxc/xc_misc.c b/tools/libxc/xc_misc.c index 06e90de..3651cab 100644 --- a/tools/libxc/xc_misc.c +++ b/tools/libxc/xc_misc.c @@ -584,31 +584,18 @@ int xc_hvm_track_dirty_vram( uint64_t first_pfn, uint64_t nr, unsigned long *dirty_bitmap) { - DECLARE_HYPERCALL_BOUNCE(dirty_bitmap, (nr+7) / 8, XC_HYPERCALL_BUFFER_BOUNCE_OUT); - DECLARE_HYPERCALL_BUFFER(struct xen_hvm_track_dirty_vram, arg); - int rc; + struct xen_dm_op op; + struct xen_dm_op_track_dirty_vram *data; - arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg)); - if ( arg == NULL || xc_hypercall_bounce_pre(xch, dirty_bitmap) ) - { - PERROR("Could not bounce memory for xc_hvm_track_dirty_vram hypercall"); - rc = -1; - goto out; - } - - arg->domid = dom; - arg->first_pfn = first_pfn; - arg->nr = nr; - set_xen_guest_handle(arg->dirty_bitmap, dirty_bitmap); + op.op = DMOP_track_dirty_vram; + data = &op.u.track_dirty_vram; - rc = xencall2(xch->xcall, __HYPERVISOR_hvm_op, - HVMOP_track_dirty_vram, - HYPERCALL_BUFFER_AS_ARG(arg)); + data->first_pfn = first_pfn; + /* NOTE: The following assignment truncates nr to 32-bits */ + data->nr = nr; -out: - xc_hypercall_buffer_free(xch, arg); - xc_hypercall_bounce_post(xch, dirty_bitmap); - return rc; + return do_dm_op(xch, dom, 2, &op, sizeof(op), + dirty_bitmap, (nr + 7) / 8); } int xc_hvm_modified_memory( diff --git a/xen/arch/x86/hvm/dm.c b/xen/arch/x86/hvm/dm.c index c718a76..78dd6e7 100644 --- a/xen/arch/x86/hvm/dm.c +++ b/xen/arch/x86/hvm/dm.c @@ -18,6 +18,8 @@ #include <xen/guest_access.h> #include <xen/sched.h> #include <asm/hvm/ioreq.h> +#include <asm/hap.h> +#include <asm/shadow.h> #include <xsm/xsm.h> static int dm_op_get_buf(XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs, @@ -74,6 +76,35 @@ static int dm_op_copy_buf_to_guest(XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs, return 0; } +static int dm_op_track_dirty_vram(struct domain *d, + unsigned int nr_bufs, + XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs, + xen_pfn_t first_pfn, unsigned int nr) +{ + struct xen_dm_op_buf buf; + int rc; + + if ( nr > GB(1) >> PAGE_SHIFT ) + return -EINVAL; + + if ( d->is_dying ) + return -ESRCH; + + if ( d->vcpu == NULL || d->vcpu[0] == NULL ) + return -EINVAL; + + rc = dm_op_get_buf(bufs, nr_bufs, 1, &buf); + if ( rc ) + return rc; + + if ( ((nr + 7) / 8) > buf.size ) + return -EINVAL; + + return shadow_mode_enabled(d) ? + shadow_track_dirty_vram(d, first_pfn, nr, buf.h) : + hap_track_dirty_vram(d, first_pfn, nr, buf.h); +} + long do_dm_op(domid_t domid, unsigned int nr_bufs, XEN_GUEST_HANDLE_PARAM(xen_dm_op_buf_t) bufs) @@ -157,11 +188,19 @@ long do_dm_op(domid_t domid, rc = hvm_destroy_ioreq_server(d, data->id); break; } + case DMOP_track_dirty_vram: + { + struct xen_dm_op_track_dirty_vram *data = + &op.u.track_dirty_vram; + + rc = dm_op_track_dirty_vram(d, nr_bufs, bufs, data->first_pfn, + data->nr); + break; + } default: rc = -EOPNOTSUPP; break; } - if ( rc == -ERESTART ) restart = true; @@ -178,7 +217,7 @@ out: domid, nr_bufs, bufs); return rc; -} + } /* * Local variables: diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index b2a7772..0ca9ca0 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -5537,47 +5537,6 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE_PARAM(void) arg) rc = guest_handle_is_null(arg) ? hvmop_flush_tlb_all() : -EINVAL; break; - case HVMOP_track_dirty_vram: - { - struct xen_hvm_track_dirty_vram a; - struct domain *d; - - if ( copy_from_guest(&a, arg, 1) ) - return -EFAULT; - - rc = rcu_lock_remote_domain_by_id(a.domid, &d); - if ( rc != 0 ) - return rc; - - rc = -EINVAL; - if ( !is_hvm_domain(d) ) - goto tdv_fail; - - if ( a.nr > GB(1) >> PAGE_SHIFT ) - goto tdv_fail; - - rc = xsm_hvm_control(XSM_DM_PRIV, d, op); - if ( rc ) - goto tdv_fail; - - rc = -ESRCH; - if ( d->is_dying ) - goto tdv_fail; - - rc = -EINVAL; - if ( d->vcpu == NULL || d->vcpu[0] == NULL ) - goto tdv_fail; - - if ( shadow_mode_enabled(d) ) - rc = shadow_track_dirty_vram(d, a.first_pfn, a.nr, a.dirty_bitmap); - else - rc = hap_track_dirty_vram(d, a.first_pfn, a.nr, a.dirty_bitmap); - - tdv_fail: - rcu_unlock_domain(d); - break; - } - case HVMOP_modified_memory: { struct xen_hvm_modified_memory a; diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 3218fa2..4788e03 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -68,7 +68,7 @@ int hap_track_dirty_vram(struct domain *d, unsigned long begin_pfn, unsigned long nr, - XEN_GUEST_HANDLE_64(uint8) guest_dirty_bitmap) + XEN_GUEST_HANDLE_PARAM(void) guest_dirty_bitmap) { long rc = 0; struct sh_dirty_vram *dirty_vram; diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index ced2313..b99aa59 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -3677,7 +3677,7 @@ static void sh_clean_dirty_bitmap(struct domain *d) int shadow_track_dirty_vram(struct domain *d, unsigned long begin_pfn, unsigned long nr, - XEN_GUEST_HANDLE_64(uint8) guest_dirty_bitmap) + XEN_GUEST_HANDLE_PARAM(void) guest_dirty_bitmap) { int rc = 0; unsigned long end_pfn = begin_pfn + nr; diff --git a/xen/include/asm-x86/hap.h b/xen/include/asm-x86/hap.h index c613836..dbf1da2 100644 --- a/xen/include/asm-x86/hap.h +++ b/xen/include/asm-x86/hap.h @@ -43,7 +43,7 @@ void hap_vcpu_init(struct vcpu *v); int hap_track_dirty_vram(struct domain *d, unsigned long begin_pfn, unsigned long nr, - XEN_GUEST_HANDLE_64(uint8) dirty_bitmap); + XEN_GUEST_HANDLE_PARAM(void) dirty_bitmap); extern const struct paging_mode *hap_paging_get_mode(struct vcpu *); void hap_set_alloc_for_pvh_dom0(struct domain *d, unsigned long num_pages); diff --git a/xen/include/asm-x86/shadow.h b/xen/include/asm-x86/shadow.h index 6d0aefb..c305171 100644 --- a/xen/include/asm-x86/shadow.h +++ b/xen/include/asm-x86/shadow.h @@ -63,7 +63,7 @@ int shadow_enable(struct domain *d, u32 mode); int shadow_track_dirty_vram(struct domain *d, unsigned long first_pfn, unsigned long nr, - XEN_GUEST_HANDLE_64(uint8) dirty_bitmap); + XEN_GUEST_HANDLE_PARAM(void) dirty_bitmap); /* Handler for shadow control ops: operations from user-space to enable * and disable ephemeral shadow modes (test mode and log-dirty mode) and diff --git a/xen/include/public/hvm/dm_op.h b/xen/include/public/hvm/dm_op.h index dc1d2ad..c1557eb 100644 --- a/xen/include/public/hvm/dm_op.h +++ b/xen/include/public/hvm/dm_op.h @@ -179,6 +179,21 @@ struct xen_dm_op_destroy_ioreq_server { ioservid_t id; }; +/* + * DMOP_track_dirty_vram: Track modifications to the specified pfn range. + * + * NOTE: The bitmap passed back to the caller is passed in a + * secondary buffer. + */ +#define DMOP_track_dirty_vram 7 + +struct xen_dm_op_track_dirty_vram { + /* IN - number of pages to be tracked */ + uint32_t nr; + /* IN - first pfn to track */ + uint64_aligned_t first_pfn; +}; + struct xen_dm_op { uint32_t op; union { @@ -188,6 +203,7 @@ struct xen_dm_op { struct xen_dm_op_ioreq_server_range unmap_io_range_from_ioreq_server; struct xen_dm_op_set_ioreq_server_state set_ioreq_server_state; struct xen_dm_op_destroy_ioreq_server destroy_ioreq_server; + struct xen_dm_op_track_dirty_vram track_dirty_vram; } u; }; diff --git a/xen/include/public/hvm/hvm_op.h b/xen/include/public/hvm/hvm_op.h index cf5e59a..1bb5221 100644 --- a/xen/include/public/hvm/hvm_op.h +++ b/xen/include/public/hvm/hvm_op.h @@ -96,6 +96,8 @@ typedef enum { /* Following tools-only interfaces may change in future. */ #if defined(__XEN__) || defined(__XEN_TOOLS__) +#if __XEN_INTERFACE_VERSION__ < 0x00040900 + /* Track dirty VRAM. */ #define HVMOP_track_dirty_vram 6 struct xen_hvm_track_dirty_vram { @@ -112,6 +114,8 @@ struct xen_hvm_track_dirty_vram { typedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t); +#endif /* __XEN_INTERFACE_VERSION__ < 0x00040900 */ + /* Notify that some pages got modified by the Device Model. */ #define HVMOP_modified_memory 7 struct xen_hvm_modified_memory { diff --git a/xen/xsm/flask/hooks.c b/xen/xsm/flask/hooks.c index d60c96d..7972546 100644 --- a/xen/xsm/flask/hooks.c +++ b/xen/xsm/flask/hooks.c @@ -1177,9 +1177,6 @@ static int flask_hvm_param(struct domain *d, unsigned long op) case HVMOP_get_param: perm = HVM__GETPARAM; break; - case HVMOP_track_dirty_vram: - perm = HVM__TRACKDIRTYVRAM; - break; default: perm = HVM__HVMCTL; } diff --git a/xen/xsm/flask/policy/access_vectors b/xen/xsm/flask/policy/access_vectors index 49c9a9e..5af427f 100644 --- a/xen/xsm/flask/policy/access_vectors +++ b/xen/xsm/flask/policy/access_vectors @@ -266,8 +266,6 @@ class hvm bind_irq # XEN_DOMCTL_pin_mem_cacheattr cacheattr -# HVMOP_track_dirty_vram - trackdirtyvram # HVMOP_modified_memory, HVMOP_get_mem_type, HVMOP_set_mem_type, # HVMOP_set_mem_access, HVMOP_get_mem_access, HVMOP_pagetable_dying, # HVMOP_inject_trap -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |