|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] Improve performance of IOCTL_PRIVCMD_MMAPBATCH_V2
On 16/11/12 14:45, Mats Petersson wrote:
Add "xen/privcmd:" prefix to subject.
> This patch makes the IOCTL_PRIVCMD_MMAPBATCH_V2 (and older V1 version)
> map multiple (typically 1024) pages at a time rather than one page at a
> time, despite the pages being non-consecutive MFNs. The main change is
> to pass a pointer to an array of mfns, rather than one mfn. To support
> error reporting, we also pass an err_ptr. If err_ptr is NULL, it indicates
> we want the contiguous pages behaviour, so the mfn value is incremented
> rather than the pointer itself. Performance of mapping guest memory into
> Dom0 is improved by a factor of around 6 with this change.
Can you include details on the test and the raw figures as well?
> Signed-off-by: Mats Petersson <mats.petersson@xxxxxxxxxx>
> ---
> arch/x86/xen/mmu.c | 47 ++++++++++++++++++++++++++-------
> drivers/xen/privcmd.c | 70
> ++++++++++++++++++++++++++++++++++++++++++-------
> include/xen/xen-ops.h | 5 ++--
> 3 files changed, 100 insertions(+), 22 deletions(-)
>
> diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
> index dcf5f2d..c5e23ba 100644
> --- a/arch/x86/xen/mmu.c
> +++ b/arch/x86/xen/mmu.c
> @@ -2477,7 +2477,8 @@ void __init xen_hvm_init_mmu_ops(void)
> #define REMAP_BATCH_SIZE 16
>
> struct remap_data {
> - unsigned long mfn;
> + unsigned long *mfn;
> + int contiguous;
bool.
> pgprot_t prot;
> struct mmu_update *mmu_update;
> };
> @@ -2486,7 +2487,13 @@ static int remap_area_mfn_pte_fn(pte_t *ptep,
> pgtable_t token,
> unsigned long addr, void *data)
> {
> struct remap_data *rmd = data;
> - pte_t pte = pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
> + pte_t pte = pte_mkspecial(pfn_pte(*rmd->mfn, rmd->prot));
> + /* If we have a contigious range, just update the mfn itself,
> + else update pointer to be "next mfn". */
> + if (rmd->contiguous)
> + (*rmd->mfn)++;
> + else
> + rmd->mfn++;
>
> rmd->mmu_update->ptr = virt_to_machine(ptep).maddr;
> rmd->mmu_update->val = pte_val_ma(pte);
> @@ -2495,16 +2502,17 @@ static int remap_area_mfn_pte_fn(pte_t *ptep,
> pgtable_t token,
> return 0;
> }
>
> +
> int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
> unsigned long addr,
> - unsigned long mfn, int nr,
> - pgprot_t prot, unsigned domid)
> + unsigned long *mfn, int nr,
> + int *err_ptr, pgprot_t prot,
> + unsigned domid)
> {
> + int err;
> struct remap_data rmd;
> struct mmu_update mmu_update[REMAP_BATCH_SIZE];
> - int batch;
> unsigned long range;
> - int err = 0;
>
> if (xen_feature(XENFEAT_auto_translated_physmap))
> return -EINVAL;
> @@ -2515,9 +2523,15 @@ int xen_remap_domain_mfn_range(struct vm_area_struct
> *vma,
>
> rmd.mfn = mfn;
> rmd.prot = prot;
> + /* We use the err_ptr to indicate if there we are doing a contigious
> + * mapping or a discontigious mapping. */
> + rmd.contiguous = !err_ptr;
This is non-obvious for an API call. Suggest having two wrapper
functions for the two different use cases that share a common internal
implementation.
e.g.,
int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
unsigned long addr,
unsigned long *mfns, int nr,
int *err_ptr,
pgprot_t prot, unsigned domid)
int xen_remap_domain_mfn_range(struct vm_area_struct *vma,
unsigned long addr,
unsigned long start_mfn, unsigned long end_mfn,
pgprot_t prot, unsigned domid)
It would be nice if the API calls had some docs as well (e.g., in
kernel-doc style).
David
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |