[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH V8 03/12] xen/mem_paging: Convert mem_event_op to mem_paging_op and cleanup
The only use-case of the mem_event_op structure had been in mem_paging, thus renaming the structure mem_paging_op and relocating its associated functions clarifies its actual usage. As part of this fix-up we also convert the gfn's in the toolstack to be explicitely 64-bit wide and clean the code a bit. Signed-off-by: Tamas K Lengyel <tamas.lengyel@xxxxxxxxxxxx> Acked-by: Tim Deegan <tim@xxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxx> --- v8: Fix gfn definiton in xenctrl.h to be uint64_t for paging ops v6: Make gfn's explicitily 64-bit in the toolstack v5: Style fixes v4: Style fixes v3: Style fixes --- tools/libxc/include/xenctrl.h | 10 +++---- tools/libxc/xc_mem_event.c | 16 ------------ tools/libxc/xc_mem_paging.c | 56 +++++++++++++++++++++++----------------- tools/libxc/xc_private.h | 3 --- xen/arch/x86/mm/mem_paging.c | 32 ++++++++++------------- xen/arch/x86/x86_64/compat/mm.c | 10 ++++--- xen/arch/x86/x86_64/mm.c | 8 +++--- xen/common/mem_event.c | 4 +-- xen/include/asm-x86/mem_paging.h | 5 +++- xen/include/public/memory.h | 9 +++---- 10 files changed, 71 insertions(+), 82 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index df18292..9aeb82e 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2270,11 +2270,11 @@ int xc_tmem_restore_extra(xc_interface *xch, int dom, int fd); int xc_mem_paging_enable(xc_interface *xch, domid_t domain_id, uint32_t *port); int xc_mem_paging_disable(xc_interface *xch, domid_t domain_id); int xc_mem_paging_nominate(xc_interface *xch, domid_t domain_id, - unsigned long gfn); -int xc_mem_paging_evict(xc_interface *xch, domid_t domain_id, unsigned long gfn); -int xc_mem_paging_prep(xc_interface *xch, domid_t domain_id, unsigned long gfn); -int xc_mem_paging_load(xc_interface *xch, domid_t domain_id, - unsigned long gfn, void *buffer); + uint64_t gfn); +int xc_mem_paging_evict(xc_interface *xch, domid_t domain_id, uint64_t gfn); +int xc_mem_paging_prep(xc_interface *xch, domid_t domain_id, uint64_t gfn); +int xc_mem_paging_load(xc_interface *xch, domid_t domain_id, + uint64_t gfn, void *buffer); /** * Access tracking operations. diff --git a/tools/libxc/xc_mem_event.c b/tools/libxc/xc_mem_event.c index 4bb120d..487fcee 100644 --- a/tools/libxc/xc_mem_event.c +++ b/tools/libxc/xc_mem_event.c @@ -40,22 +40,6 @@ int xc_mem_event_control(xc_interface *xch, domid_t domain_id, unsigned int op, return rc; } -int xc_mem_event_memop(xc_interface *xch, domid_t domain_id, - unsigned int op, unsigned int mode, - uint64_t gfn, void *buffer) -{ - xen_mem_event_op_t meo; - - memset(&meo, 0, sizeof(meo)); - - meo.op = op; - meo.domain = domain_id; - meo.gfn = gfn; - meo.buffer = (unsigned long) buffer; - - return do_memory_op(xch, mode, &meo, sizeof(meo)); -} - void *xc_mem_event_enable(xc_interface *xch, domid_t domain_id, int param, uint32_t *port, int enable_introspection) { diff --git a/tools/libxc/xc_mem_paging.c b/tools/libxc/xc_mem_paging.c index 5194423..32c4703 100644 --- a/tools/libxc/xc_mem_paging.c +++ b/tools/libxc/xc_mem_paging.c @@ -23,6 +23,20 @@ #include "xc_private.h" +static int xc_mem_paging_memop(xc_interface *xch, domid_t domain_id, + unsigned int op, uint64_t gfn, void *buffer) +{ + xen_mem_paging_op_t mpo; + + memset(&mpo, 0, sizeof(mpo)); + + mpo.op = op; + mpo.domain = domain_id; + mpo.gfn = gfn; + mpo.buffer = (unsigned long) buffer; + + return do_memory_op(xch, XENMEM_paging_op, &mpo, sizeof(mpo)); +} int xc_mem_paging_enable(xc_interface *xch, domid_t domain_id, uint32_t *port) @@ -32,7 +46,7 @@ int xc_mem_paging_enable(xc_interface *xch, domid_t domain_id, errno = EINVAL; return -1; } - + return xc_mem_event_control(xch, domain_id, XEN_MEM_EVENT_PAGING_ENABLE, XEN_DOMCTL_MEM_EVENT_OP_PAGING, @@ -47,32 +61,29 @@ int xc_mem_paging_disable(xc_interface *xch, domid_t domain_id) NULL); } -int xc_mem_paging_nominate(xc_interface *xch, domid_t domain_id, unsigned long gfn) +int xc_mem_paging_nominate(xc_interface *xch, domid_t domain_id, uint64_t gfn) { - return xc_mem_event_memop(xch, domain_id, - XENMEM_paging_op_nominate, - XENMEM_paging_op, - gfn, NULL); + return xc_mem_paging_memop(xch, domain_id, + XENMEM_paging_op_nominate, + gfn, NULL); } -int xc_mem_paging_evict(xc_interface *xch, domid_t domain_id, unsigned long gfn) +int xc_mem_paging_evict(xc_interface *xch, domid_t domain_id, uint64_t gfn) { - return xc_mem_event_memop(xch, domain_id, - XENMEM_paging_op_evict, - XENMEM_paging_op, - gfn, NULL); + return xc_mem_paging_memop(xch, domain_id, + XENMEM_paging_op_evict, + gfn, NULL); } -int xc_mem_paging_prep(xc_interface *xch, domid_t domain_id, unsigned long gfn) +int xc_mem_paging_prep(xc_interface *xch, domid_t domain_id, uint64_t gfn) { - return xc_mem_event_memop(xch, domain_id, - XENMEM_paging_op_prep, - XENMEM_paging_op, - gfn, NULL); + return xc_mem_paging_memop(xch, domain_id, + XENMEM_paging_op_prep, + gfn, NULL); } -int xc_mem_paging_load(xc_interface *xch, domid_t domain_id, - unsigned long gfn, void *buffer) +int xc_mem_paging_load(xc_interface *xch, domid_t domain_id, + uint64_t gfn, void *buffer) { int rc, old_errno; @@ -86,11 +97,10 @@ int xc_mem_paging_load(xc_interface *xch, domid_t domain_id, if ( mlock(buffer, XC_PAGE_SIZE) ) return -1; - - rc = xc_mem_event_memop(xch, domain_id, - XENMEM_paging_op_prep, - XENMEM_paging_op, - gfn, buffer); + + rc = xc_mem_paging_memop(xch, domain_id, + XENMEM_paging_op_prep, + gfn, buffer); old_errno = errno; munlock(buffer, XC_PAGE_SIZE); diff --git a/tools/libxc/xc_private.h b/tools/libxc/xc_private.h index 45b8644..f1f601c 100644 --- a/tools/libxc/xc_private.h +++ b/tools/libxc/xc_private.h @@ -425,9 +425,6 @@ int xc_ffs64(uint64_t x); */ int xc_mem_event_control(xc_interface *xch, domid_t domain_id, unsigned int op, unsigned int mode, uint32_t *port); -int xc_mem_event_memop(xc_interface *xch, domid_t domain_id, - unsigned int op, unsigned int mode, - uint64_t gfn, void *buffer); /* * Enables mem_event and returns the mapped ring page indicated by param. * param can be HVM_PARAM_PAGING/ACCESS/SHARING_RING_PFN diff --git a/xen/arch/x86/mm/mem_paging.c b/xen/arch/x86/mm/mem_paging.c index 65f6a3d..87a7b72 100644 --- a/xen/arch/x86/mm/mem_paging.c +++ b/xen/arch/x86/mm/mem_paging.c @@ -25,38 +25,32 @@ #include <xen/mem_event.h> -int mem_paging_memop(struct domain *d, xen_mem_event_op_t *mec) +int mem_paging_memop(struct domain *d, xen_mem_paging_op_t *mpo) { + int rc = -ENODEV; if ( unlikely(!d->mem_event->paging.ring_page) ) - return -ENODEV; + return rc; - switch( mec->op ) + switch( mpo->op ) { case XENMEM_paging_op_nominate: - { - unsigned long gfn = mec->gfn; - return p2m_mem_paging_nominate(d, gfn); - } - break; + rc = p2m_mem_paging_nominate(d, mpo->gfn); + break; case XENMEM_paging_op_evict: - { - unsigned long gfn = mec->gfn; - return p2m_mem_paging_evict(d, gfn); - } - break; + rc = p2m_mem_paging_evict(d, mpo->gfn); + break; case XENMEM_paging_op_prep: - { - unsigned long gfn = mec->gfn; - return p2m_mem_paging_prep(d, gfn, mec->buffer); - } - break; + rc = p2m_mem_paging_prep(d, mpo->gfn, mpo->buffer); + break; default: - return -ENOSYS; + rc = -ENOSYS; break; } + + return rc; } diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c index 1491ce3..3944936 100644 --- a/xen/arch/x86/x86_64/compat/mm.c +++ b/xen/arch/x86/x86_64/compat/mm.c @@ -188,11 +188,12 @@ int compat_arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) case XENMEM_paging_op: { - xen_mem_event_op_t meo; - if ( copy_from_guest(&meo, arg, 1) ) + xen_mem_paging_op_t mpo; + + if ( copy_from_guest(&mpo, arg, 1) ) return -EFAULT; - rc = do_mem_event_op(cmd, meo.domain, &meo); - if ( !rc && __copy_to_guest(arg, &meo, 1) ) + rc = do_mem_event_op(cmd, mpo.domain, &mpo); + if ( !rc && __copy_to_guest(arg, &mpo, 1) ) return -EFAULT; break; } @@ -200,6 +201,7 @@ int compat_arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) case XENMEM_sharing_op: { xen_mem_sharing_op_t mso; + if ( copy_from_guest(&mso, arg, 1) ) return -EFAULT; if ( mso.op == XENMEM_sharing_op_audit ) diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 6875c92..4ed4174 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -985,11 +985,11 @@ long subarch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) case XENMEM_paging_op: { - xen_mem_event_op_t meo; - if ( copy_from_guest(&meo, arg, 1) ) + xen_mem_paging_op_t mpo; + if ( copy_from_guest(&mpo, arg, 1) ) return -EFAULT; - rc = do_mem_event_op(cmd, meo.domain, &meo); - if ( !rc && __copy_to_guest(arg, &meo, 1) ) + rc = do_mem_event_op(cmd, mpo.domain, &mpo); + if ( !rc && __copy_to_guest(arg, &mpo, 1) ) return -EFAULT; break; } diff --git a/xen/common/mem_event.c b/xen/common/mem_event.c index b96d9fb..ae60c10 100644 --- a/xen/common/mem_event.c +++ b/xen/common/mem_event.c @@ -475,12 +475,12 @@ int do_mem_event_op(int op, uint32_t domain, void *arg) { #ifdef HAS_MEM_PAGING case XENMEM_paging_op: - ret = mem_paging_memop(d, (xen_mem_event_op_t *) arg); + ret = mem_paging_memop(d, arg); break; #endif #ifdef HAS_MEM_SHARING case XENMEM_sharing_op: - ret = mem_sharing_memop(d, (xen_mem_sharing_op_t *) arg); + ret = mem_sharing_memop(d, arg); break; #endif default: diff --git a/xen/include/asm-x86/mem_paging.h b/xen/include/asm-x86/mem_paging.h index 6b7a1fe..5f0f91b 100644 --- a/xen/include/asm-x86/mem_paging.h +++ b/xen/include/asm-x86/mem_paging.h @@ -20,9 +20,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifndef __ASM_X86_MEM_PAGING_H__ +#define __ASM_X86_MEM_PAGING_H__ -int mem_paging_memop(struct domain *d, xen_mem_event_op_t *meo); +int mem_paging_memop(struct domain *d, xen_mem_paging_op_t *mpo); +#endif /*__ASM_X86_MEM_PAGING_H__ */ /* * Local variables: diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h index 2b5206b..043c26d 100644 --- a/xen/include/public/memory.h +++ b/xen/include/public/memory.h @@ -374,18 +374,17 @@ typedef struct xen_pod_target xen_pod_target_t; #define XENMEM_paging_op_evict 1 #define XENMEM_paging_op_prep 2 -struct xen_mem_event_op { - uint8_t op; /* XENMEM_*_op_* */ +struct xen_mem_paging_op { + uint8_t op; /* XENMEM_paging_op_* */ domid_t domain; - /* PAGING_PREP IN: buffer to immediately fill page in */ uint64_aligned_t buffer; /* Other OPs */ uint64_aligned_t gfn; /* IN: gfn of page being operated on */ }; -typedef struct xen_mem_event_op xen_mem_event_op_t; -DEFINE_XEN_GUEST_HANDLE(xen_mem_event_op_t); +typedef struct xen_mem_paging_op xen_mem_paging_op_t; +DEFINE_XEN_GUEST_HANDLE(xen_mem_paging_op_t); #define XENMEM_access_op 21 #define XENMEM_access_op_resume 0 -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |