diff options
| author | Alex Nixon <alex.nixon@citrix.com> | 2009-02-09 12:05:46 -0800 | 
|---|---|---|
| committer | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> | 2010-06-07 15:37:53 -0400 | 
| commit | 08bbc9da92f7e44b9c208c6a1adba70c403b255e (patch) | |
| tree | 75c6cf9422e03990d1fd280b631d00ea4d4dbe4b /include | |
| parent | 19001c8c5bfa032ed45b10dfe48e355f5df88c61 (diff) | |
| download | olio-linux-3.10-08bbc9da92f7e44b9c208c6a1adba70c403b255e.tar.xz olio-linux-3.10-08bbc9da92f7e44b9c208c6a1adba70c403b255e.zip  | |
xen: Add xen_create_contiguous_region
A memory region must be physically contiguous in order to be accessed
through DMA.  This patch adds xen_create_contiguous_region, which
ensures a region of contiguous virtual memory is also physically
contiguous.
Based on Stephen Tweedie's port of the 2.6.18-xen version.
Remove contiguous_bitmap[] as it's no longer needed.
Ported from linux-2.6.18-xen.hg 707:e410857fd83c
[ Impact: add Xen-internal API to make pages phys-contig ]
Signed-off-by: Alex Nixon <alex.nixon@citrix.com>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/xen/interface/memory.h | 42 | ||||
| -rw-r--r-- | include/xen/xen-ops.h | 6 | 
2 files changed, 48 insertions, 0 deletions
diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index e6adce6bc75..d3938d3e71f 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h @@ -55,6 +55,48 @@ struct xen_memory_reservation {  DEFINE_GUEST_HANDLE_STRUCT(xen_memory_reservation);  /* + * An atomic exchange of memory pages. If return code is zero then + * @out.extent_list provides GMFNs of the newly-allocated memory. + * Returns zero on complete success, otherwise a negative error code. + * On complete success then always @nr_exchanged == @in.nr_extents. + * On partial success @nr_exchanged indicates how much work was done. + */ +#define XENMEM_exchange             11 +struct xen_memory_exchange { +    /* +     * [IN] Details of memory extents to be exchanged (GMFN bases). +     * Note that @in.address_bits is ignored and unused. +     */ +    struct xen_memory_reservation in; + +    /* +     * [IN/OUT] Details of new memory extents. +     * We require that: +     *  1. @in.domid == @out.domid +     *  2. @in.nr_extents  << @in.extent_order == +     *     @out.nr_extents << @out.extent_order +     *  3. @in.extent_start and @out.extent_start lists must not overlap +     *  4. @out.extent_start lists GPFN bases to be populated +     *  5. @out.extent_start is overwritten with allocated GMFN bases +     */ +    struct xen_memory_reservation out; + +    /* +     * [OUT] Number of input extents that were successfully exchanged: +     *  1. The first @nr_exchanged input extents were successfully +     *     deallocated. +     *  2. The corresponding first entries in the output extent list correctly +     *     indicate the GMFNs that were successfully exchanged. +     *  3. All other input and output extents are untouched. +     *  4. If not all input exents are exchanged then the return code of this +     *     command will be non-zero. +     *  5. THIS FIELD MUST BE INITIALISED TO ZERO BY THE CALLER! +     */ +    unsigned long nr_exchanged; +}; + +DEFINE_GUEST_HANDLE_STRUCT(xen_memory_exchange); +/*   * Returns the maximum machine frame number of mapped RAM in this system.   * This command always succeeds (it never returns an error code).   * arg == NULL. diff --git a/include/xen/xen-ops.h b/include/xen/xen-ops.h index 883a21bba24..d789c937c48 100644 --- a/include/xen/xen-ops.h +++ b/include/xen/xen-ops.h @@ -14,4 +14,10 @@ void xen_mm_unpin_all(void);  void xen_timer_resume(void);  void xen_arch_resume(void); +extern unsigned long *xen_contiguous_bitmap; +int xen_create_contiguous_region(unsigned long vstart, unsigned int order, +				unsigned int address_bits); + +void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order); +  #endif /* INCLUDE_XEN_OPS_H */  |