|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/7] x86/mm: Combine create_grant_{pte, va}_mapping()
On Tue, Sep 12, 2017 at 01:14:43PM +0100, Andrew Cooper wrote:
> create_grant_{pte,va}_mapping() are nearly identical; all that is really
> different between them is how they convert their addr parameter to the pte to
> install the grant into.
>
> Reimplement their logic in create_grant_pv_mapping() in a mostly common way.
>
> No (intended) change in behaviour from a guests point of view.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Wei Liu <wei.liu2@xxxxxxxxxx>
With one optional request.
> @@ -4126,13 +4012,67 @@ int create_grant_pv_mapping(uint64_t addr, unsigned
> long frame,
> unsigned int flags, unsigned int cache_flags)
> {
> struct vcpu *curr = current;
> - l1_pgentry_t nl1e;
> + struct domain *currd = curr->domain;
> + l1_pgentry_t nl1e, ol1e, *pl1e;
> + struct page_info *page;
> + mfn_t gl1mfn;
> + int rc = GNTST_general_error;
>
> nl1e = l1e_from_pfn(frame, grant_to_pte_flags(flags, cache_flags));
> + nl1e = adjust_guest_l1e(nl1e, currd);
>
> + /*
> + * The meaning of addr depends on GNTMAP_contains_pte. It is either a
> + * machine address of an L1e the guest has nominated to be altered, or a
> + * linear address we need to look up the appropriate L1e for.
> + */
> if ( flags & GNTMAP_contains_pte )
> - return create_grant_pte_mapping(addr, nl1e, curr);
> - return create_grant_va_mapping(addr, nl1e, curr);
> + {
> + /* addr must be suitably aligned, or we will corrupt adjacent ptes.
> */
> + if ( !IS_ALIGNED(addr, sizeof(nl1e)) )
> + goto out;
Can you sprinkle some gdprintk's in these error paths to aid debugging?
> +
> + gl1mfn = _mfn(addr >> PAGE_SHIFT);
> +
> + if ( !get_page_from_mfn(gl1mfn, currd) )
> + goto out;
> +
> + pl1e = map_domain_page(gl1mfn) + (addr & ~PAGE_MASK);
> + }
> + else
> + {
> + pl1e = map_guest_l1e(addr, &gl1mfn);
> +
> + if ( !pl1e )
> + goto out;
> +
> + if ( !get_page_from_mfn(gl1mfn, currd) )
> + goto out_unmap;
> + }
> +
> + page = mfn_to_page(gl1mfn);
> + if ( !page_lock(page) )
> + goto out_put;
> +
> + if ( (page->u.inuse.type_info & PGT_type_mask) != PGT_l1_page_table )
> + goto out_unlock;
> +
> + ol1e = *pl1e;
> + if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, mfn_x(gl1mfn), curr, 0) )
> + rc = GNTST_okay;
> +
> + out_unlock:
> + page_unlock(page);
> + out_put:
> + put_page(page);
> + out_unmap:
> + unmap_domain_page(pl1e);
> +
> + if ( rc == GNTST_okay )
> + put_page_from_l1e(ol1e, currd);
> +
> + out:
> + return rc;
> }
>
> int replace_grant_pv_mapping(uint64_t addr, unsigned long frame,
> --
> 2.1.4
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |