|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 1/3] x86/mem_access: Make the mem_access ops generic
On 14/04/14 23:02, Aravindh Puthiyaparambil wrote:
> This patch does the following:
> 1. Deprecate the HVMOP_[sg]et_mem_access HVM ops.
> 2. Move the ops under XENMEM_access_opi.
> 3. Rename enums and structs to be more generic rather than HVM specific.
> 4. Remove the enums and structs associated with the HVM ops.
>
> Signed-off-by: Aravindh Puthiyaparambil <aravindp@xxxxxxxxx>
> Cc: Keir Fraser <keir@xxxxxxx>
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Tim Deegan <tim@xxxxxxx>
>
> ---
> Changes from version 1 of the patch:
> 1. Use MEMOP_CMD_MASK instead of introducing a new mask.
> 2. Pass "cmd" down from do_memory_op() instead of "op" and "start_extent".
> 3. Pass typed handle to mem_access_memop() and use __copy_field_to_guest().
> 4. Use ACCESS() macro to remove ordering dependency.
> 5. Add compat verification for xen_mem_access_op_t.
> 6. Fix formatting.
>
> Changes from the RFC version of the patch:
> 1. Removed pointless braces.
> 2. Change preemption handling to use upper "cmd" bits from
> do_memory_op().
> 3. Delete old interface enum and structs.
> 4. Remove xenmem_ prefix.
> 5. Make access uint8_t and place above domid.
>
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index 38c491e..eeaa72e 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -4589,79 +4589,10 @@ long do_hvm_op(unsigned long op,
> XEN_GUEST_HANDLE_PARAM(void) arg)
> }
>
> case HVMOP_set_mem_access:
> - {
> - struct xen_hvm_set_mem_access 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 param_fail5;
> -
> - rc = xsm_hvm_param(XSM_TARGET, d, op);
> - if ( rc )
> - goto param_fail5;
> -
> - rc = -EINVAL;
> - if ( (a.first_pfn != ~0ull) &&
> - (a.nr < start_iter ||
> - ((a.first_pfn + a.nr - 1) < a.first_pfn) ||
> - ((a.first_pfn + a.nr - 1) > domain_get_maximum_gpfn(d))) )
> - goto param_fail5;
> -
> - rc = p2m_set_mem_access(d, a.first_pfn, a.nr, start_iter,
> - HVMOP_op_mask, a.hvmmem_access);
> - if ( rc > 0 )
> - {
> - start_iter = rc;
> - rc = -EAGAIN;
> - }
> -
> - param_fail5:
> - rcu_unlock_domain(d);
> - break;
> - }
> -
> case HVMOP_get_mem_access:
> {
> - struct xen_hvm_get_mem_access a;
> - struct domain *d;
> - hvmmem_access_t access;
> -
> - 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 param_fail6;
> -
> - rc = xsm_hvm_param(XSM_TARGET, d, op);
> - if ( rc )
> - goto param_fail6;
> -
> - rc = -EINVAL;
> - if ( (a.pfn > domain_get_maximum_gpfn(d)) && a.pfn != ~0ull )
> - goto param_fail6;
> -
> - rc = p2m_get_mem_access(d, a.pfn, &access);
> - if ( rc != 0 )
> - goto param_fail6;
> -
> - a.hvmmem_access = access;
> - rc = __copy_to_guest(arg, &a, 1) ? -EFAULT : 0;
> -
> - param_fail6:
> - rcu_unlock_domain(d);
> + gdprintk(XENLOG_DEBUG, "Deprecated HVM op %ld.\n", op);
Is this really sensible? I suppose it should hopefully be a rare
hypercall, but it is hardly a useful message to print.
>
> /*
> * Internal functions, only called by other p2m code
> diff --git a/xen/include/public/hvm/hvm_op.h b/xen/include/public/hvm/hvm_op.h
> index 3204ec4..f00f6d2 100644
> --- a/xen/include/public/hvm/hvm_op.h
> +++ b/xen/include/public/hvm/hvm_op.h
Changes here need to be in sync with libxc as well, also for build reasons.
~Andrew
> @@ -162,49 +162,11 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_xentrace_t);
> /* Following tools-only interfaces may change in future. */
> #if defined(__XEN__) || defined(__XEN_TOOLS__)
>
> +/* Deprecated by XENMEM_access_op_set_access */
> #define HVMOP_set_mem_access 12
> -typedef enum {
> - HVMMEM_access_n,
> - HVMMEM_access_r,
> - HVMMEM_access_w,
> - HVMMEM_access_rw,
> - HVMMEM_access_x,
> - HVMMEM_access_rx,
> - HVMMEM_access_wx,
> - HVMMEM_access_rwx,
> - HVMMEM_access_rx2rw, /* Page starts off as r-x, but automatically
> - * change to r-w on a write */
> - HVMMEM_access_n2rwx, /* Log access: starts off as n, automatically
> - * goes to rwx, generating an event without
> - * pausing the vcpu */
> - HVMMEM_access_default /* Take the domain default */
> -} hvmmem_access_t;
> -/* Notify that a region of memory is to have specific access types */
> -struct xen_hvm_set_mem_access {
> - /* Domain to be updated. */
> - domid_t domid;
> - /* Memory type */
> - uint16_t hvmmem_access; /* hvm_access_t */
> - /* Number of pages, ignored on setting default access */
> - uint32_t nr;
> - /* First pfn, or ~0ull to set the default access for new pages */
> - uint64_aligned_t first_pfn;
> -};
> -typedef struct xen_hvm_set_mem_access xen_hvm_set_mem_access_t;
> -DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_access_t);
>
> +/* Deprecated by XENMEM_access_op_get_access */
> #define HVMOP_get_mem_access 13
> -/* Get the specific access type for that region of memory */
> -struct xen_hvm_get_mem_access {
> - /* Domain to be queried. */
> - domid_t domid;
> - /* Memory type: OUT */
> - uint16_t hvmmem_access; /* hvm_access_t */
> - /* pfn, or ~0ull for default access for new pages. IN */
> - uint64_aligned_t pfn;
> -};
> -typedef struct xen_hvm_get_mem_access xen_hvm_get_mem_access_t;
> -DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_mem_access_t);
>
> #define HVMOP_inject_trap 14
> /* Inject a trap into a VCPU, which will get taken up on the next
> diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h
> index f19ac14..5bcd475 100644
> --- a/xen/include/public/memory.h
> +++ b/xen/include/public/memory.h
> @@ -363,9 +363,6 @@ typedef struct xen_pod_target xen_pod_target_t;
> #define XENMEM_paging_op_evict 1
> #define XENMEM_paging_op_prep 2
>
> -#define XENMEM_access_op 21
> -#define XENMEM_access_op_resume 0
> -
> struct xen_mem_event_op {
> uint8_t op; /* XENMEM_*_op_* */
> domid_t domain;
> @@ -379,6 +376,56 @@ struct xen_mem_event_op {
> typedef struct xen_mem_event_op xen_mem_event_op_t;
> DEFINE_XEN_GUEST_HANDLE(xen_mem_event_op_t);
>
> +#define XENMEM_access_op 21
> +#define XENMEM_access_op_resume 0
> +#define XENMEM_access_op_set_access 1
> +#define XENMEM_access_op_get_access 2
> +
> +typedef enum {
> + XENMEM_access_n,
> + XENMEM_access_r,
> + XENMEM_access_w,
> + XENMEM_access_rw,
> + XENMEM_access_x,
> + XENMEM_access_rx,
> + XENMEM_access_wx,
> + XENMEM_access_rwx,
> + /*
> + * Page starts off as r-x, but automatically
> + * change to r-w on a write
> + */
> + XENMEM_access_rx2rw,
> + /*
> + * Log access: starts off as n, automatically
> + * goes to rwx, generating an event without
> + * pausing the vcpu
> + */
> + XENMEM_access_n2rwx,
> + /* Take the domain default */
> + XENMEM_access_default
> +} xenmem_access_t;
> +
> +struct xen_mem_access_op {
> + /* XENMEM_access_op_* */
> + uint8_t op;
> + /* xenmem_access_t */
> + uint8_t access;
> + domid_t domid;
> + /*
> + * Number of pages for set op
> + * Ignored on setting default access and other ops
> + */
> + uint32_t nr;
> + /*
> + * First pfn for set op
> + * pfn for get op
> + * ~0ull is used to set and get the default access for pages
> + */
> + uint64_aligned_t pfn;
> +};
> +typedef struct xen_mem_access_op xen_mem_access_op_t;
> +DEFINE_XEN_GUEST_HANDLE(xen_mem_access_op_t);
> +
> #define XENMEM_sharing_op 22
> #define XENMEM_sharing_op_nominate_gfn 0
> #define XENMEM_sharing_op_nominate_gref 1
> diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
> index 5d354d8..9a35dd7 100644
> --- a/xen/include/xlat.lst
> +++ b/xen/include/xlat.lst
> @@ -60,6 +60,7 @@
> ! memory_exchange memory.h
> ! memory_map memory.h
> ! memory_reservation memory.h
> +? mem_access_op memory.h
> ! pod_target memory.h
> ! remove_from_physmap memory.h
> ? physdev_eoi physdev.h
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |