|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 17/17] xen/arm: p2m: Rework the interface of apply_p2m_changes and use typesafe
On Tue, 28 Jun 2016, Julien Grall wrote:
> Most of the callers of apply_p2m_changes have a GFN, a MFN and the
> number of frame to change in hand.
>
> Rather than asking each caller to convert the frame to an address,
> rework the interfaces to pass the GFN, MFN and the number of frame.
>
> Note that it would be possible to do more clean-up in apply_p2m_changes,
> but this will be done in a follow-up series.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
>
> ---
> Changes in v4:
> - Patch added
> ---
> xen/arch/arm/p2m.c | 62
> ++++++++++++++++++++++++------------------------------
> 1 file changed, 28 insertions(+), 34 deletions(-)
>
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index 9fdc417..bb33a72 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -906,25 +906,26 @@ static void update_reference_mapping(struct page_info
> *page,
>
> static int apply_p2m_changes(struct domain *d,
> enum p2m_operation op,
> - paddr_t start_gpaddr,
> - paddr_t end_gpaddr,
> - paddr_t maddr,
> + gfn_t sgfn,
> + unsigned long nr,
> + mfn_t smfn,
> int mattr,
> uint32_t mask,
> p2m_type_t t,
> p2m_access_t a)
> {
> + paddr_t start_gpaddr = pfn_to_paddr(gfn_x(sgfn));
> + paddr_t end_gpaddr = pfn_to_paddr(gfn_x(sgfn) + nr);
> + paddr_t maddr = pfn_to_paddr(mfn_x(smfn));
> int rc, ret;
> struct p2m_domain *p2m = &d->arch.p2m;
> lpae_t *mappings[4] = { NULL, NULL, NULL, NULL };
> struct page_info *pages[4] = { NULL, NULL, NULL, NULL };
> - paddr_t addr, orig_maddr = maddr;
> + paddr_t addr;
> unsigned int level = 0;
> unsigned int cur_root_table = ~0;
> unsigned int cur_offset[4] = { ~0, ~0, ~0, ~0 };
> unsigned int count = 0;
> - const unsigned long sgfn = paddr_to_pfn(start_gpaddr),
> - egfn = paddr_to_pfn(end_gpaddr);
> const unsigned int preempt_count_limit = (op == MEMACCESS) ? 1 : 0x2000;
> const bool_t preempt = !is_idle_vcpu(current);
> bool_t flush = false;
> @@ -986,9 +987,9 @@ static int apply_p2m_changes(struct domain *d,
> * Preempt setting mem_access permissions as required by
> XSA-89,
> * if it's not the last iteration.
> */
> - uint32_t progress = paddr_to_pfn(addr) - sgfn + 1;
> + uint32_t progress = paddr_to_pfn(addr) - gfn_x(sgfn) + 1;
>
> - if ( (egfn - sgfn) > progress && !(progress & mask) )
> + if ( nr > progress && !(progress & mask) )
> {
> rc = progress;
> goto out;
> @@ -1117,8 +1118,9 @@ static int apply_p2m_changes(struct domain *d,
>
> if ( op == INSERT )
> {
> - p2m->max_mapped_gfn = gfn_max(p2m->max_mapped_gfn, _gfn(egfn));
> - p2m->lowest_mapped_gfn = gfn_min(p2m->lowest_mapped_gfn, _gfn(sgfn));
> + p2m->max_mapped_gfn = gfn_max(p2m->max_mapped_gfn,
> + gfn_add(sgfn, nr));
> + p2m->lowest_mapped_gfn = gfn_min(p2m->lowest_mapped_gfn, sgfn);
> }
>
> rc = 0;
> @@ -1127,7 +1129,7 @@ out:
> if ( flush )
> {
> flush_tlb_domain(d);
> - ret = iommu_iotlb_flush(d, sgfn, egfn - sgfn);
> + ret = iommu_iotlb_flush(d, gfn_x(sgfn), nr);
> if ( !rc )
> rc = ret;
> }
> @@ -1146,12 +1148,14 @@ out:
> if ( rc < 0 && ( op == INSERT ) &&
> addr != start_gpaddr )
> {
> + unsigned long gfn = paddr_to_pfn(addr);
> +
> BUG_ON(addr == end_gpaddr);
> /*
> * addr keeps the address of the end of the last
> successfully-inserted
> * mapping.
> */
> - apply_p2m_changes(d, REMOVE, start_gpaddr, addr, orig_maddr,
> + apply_p2m_changes(d, REMOVE, sgfn, gfn - gfn_x(sgfn), smfn,
Worth considering a gfn_sub (we already have gfn_add)?
In any case
Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> mattr, 0, p2m_invalid, d->arch.p2m.default_access);
> }
>
> @@ -1164,10 +1168,7 @@ static inline int p2m_insert_mapping(struct domain *d,
> mfn_t mfn,
> int mattr, p2m_type_t t)
> {
> - return apply_p2m_changes(d, INSERT,
> - pfn_to_paddr(gfn_x(start_gfn)),
> - pfn_to_paddr(gfn_x(start_gfn) + nr),
> - pfn_to_paddr(mfn_x(mfn)),
> + return apply_p2m_changes(d, INSERT, start_gfn, nr, mfn,
> mattr, 0, t, d->arch.p2m.default_access);
> }
>
> @@ -1176,10 +1177,7 @@ static inline int p2m_remove_mapping(struct domain *d,
> unsigned long nr,
> mfn_t mfn)
> {
> - return apply_p2m_changes(d, REMOVE,
> - pfn_to_paddr(gfn_x(start_gfn)),
> - pfn_to_paddr(gfn_x(start_gfn) + nr),
> - pfn_to_paddr(mfn_x(mfn)),
> + return apply_p2m_changes(d, REMOVE, start_gfn, nr, mfn,
> /* arguments below not used when removing
> mapping */
> MATTR_MEM, 0, p2m_invalid,
> d->arch.p2m.default_access);
> @@ -1399,13 +1397,13 @@ err:
> int relinquish_p2m_mapping(struct domain *d)
> {
> struct p2m_domain *p2m = &d->arch.p2m;
> + unsigned long nr;
>
> - return apply_p2m_changes(d, RELINQUISH,
> - pfn_to_paddr(gfn_x(p2m->lowest_mapped_gfn)),
> - pfn_to_paddr(gfn_x(p2m->max_mapped_gfn)),
> - pfn_to_paddr(mfn_x(INVALID_MFN)),
> - MATTR_MEM, 0, p2m_invalid,
> - d->arch.p2m.default_access);
> + nr = gfn_x(p2m->max_mapped_gfn) - gfn_x(p2m->lowest_mapped_gfn);
> +
> + return apply_p2m_changes(d, RELINQUISH, p2m->lowest_mapped_gfn, nr,
> + INVALID_MFN, MATTR_MEM, 0, p2m_invalid,
> + d->arch.p2m.default_access);
> }
>
> int p2m_cache_flush(struct domain *d, gfn_t start, unsigned long nr)
> @@ -1416,10 +1414,7 @@ int p2m_cache_flush(struct domain *d, gfn_t start,
> unsigned long nr)
> start = gfn_max(start, p2m->lowest_mapped_gfn);
> end = gfn_min(end, p2m->max_mapped_gfn);
>
> - return apply_p2m_changes(d, CACHEFLUSH,
> - pfn_to_paddr(gfn_x(start)),
> - pfn_to_paddr(gfn_x(end)),
> - pfn_to_paddr(mfn_x(INVALID_MFN)),
> + return apply_p2m_changes(d, CACHEFLUSH, start, nr, INVALID_MFN,
> MATTR_MEM, 0, p2m_invalid,
> d->arch.p2m.default_access);
> }
> @@ -1828,10 +1823,9 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn,
> uint32_t nr,
> return 0;
> }
>
> - rc = apply_p2m_changes(d, MEMACCESS,
> - pfn_to_paddr(gfn_x(gfn) + start),
> - pfn_to_paddr(gfn_x(gfn) + nr),
> - 0, MATTR_MEM, mask, 0, a);
> + rc = apply_p2m_changes(d, MEMACCESS, gfn_add(gfn, start),
> + (nr - start), INVALID_MFN,
> + MATTR_MEM, mask, 0, a);
> if ( rc < 0 )
> return rc;
> else if ( rc > 0 )
> --
> 1.9.1
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |