|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC] tools/libxc, xen/x86: Added xc_set_mem_access_sparse()
>>> On 26.08.16 at 08:11, <rcojocaru@xxxxxxxxxxxxxxx> wrote:
One general note first: I don't really like the term "sparse" here,
as that suggests to me you want to skip address space holes.
How about calling it "multi", "array", or some such?
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -1815,7 +1815,7 @@ int p2m_set_altp2m_mem_access(struct domain *d, struct
> p2m_domain *hp2m,
> * Set access type for a region of gfns.
> * If gfn == INVALID_GFN, sets the default access type.
> */
> -long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr,
> +long p2m_set_mem_access(struct domain *d, gfn_t gfn, xen_pfn_t *arr,
> uint32_t nr,
const
> @@ -1874,28 +1874,53 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn,
> uint32_t nr,
> if ( ap2m )
> p2m_lock(ap2m);
>
> - for ( gfn_l = gfn_x(gfn) + start; nr > start; ++gfn_l )
> + if ( !arr )
> {
> - if ( ap2m )
> + for ( gfn_l = gfn_x(gfn) + start; nr > start; ++gfn_l )
> {
> - rc = p2m_set_altp2m_mem_access(d, p2m, ap2m, a, _gfn(gfn_l));
> - /* If the corresponding mfn is invalid we will just skip it */
> - if ( rc && rc != -ESRCH )
> - break;
> - }
> - else
> - {
> - mfn = p2m->get_entry(p2m, gfn_l, &t, &_a, 0, NULL, NULL);
> - rc = p2m->set_entry(p2m, gfn_l, mfn, PAGE_ORDER_4K, t, a, -1);
> - if ( rc )
> + if ( ap2m )
> + {
> + rc = p2m_set_altp2m_mem_access(d, p2m, ap2m, a, _gfn(gfn_l));
> + /* If the corresponding mfn is invalid we will just skip it
> */
> + if ( rc && rc != -ESRCH )
> + break;
> + }
> + else
> + {
> + mfn = p2m->get_entry(p2m, gfn_l, &t, &_a, 0, NULL, NULL);
> + rc = p2m->set_entry(p2m, gfn_l, mfn, PAGE_ORDER_4K, t, a,
> -1);
> + if ( rc )
> + break;
> + }
> +
> + /* Check for continuation if it's not the last iteration. */
> + if ( nr > ++start && !(start & mask) &&
> hypercall_preempt_check() )
> + {
> + rc = start;
> break;
> + }
I think it would help if you broke out some of the loop body into a
helper function.
> }
> + }
> + else
> + {
> + uint32_t i;
>
> - /* Check for continuation if it's not the last iteration. */
> - if ( nr > ++start && !(start & mask) && hypercall_preempt_check() )
> + for ( i = 0; i < nr; ++i )
> {
> - rc = start;
> - break;
> + if ( ap2m )
> + {
> + rc = p2m_set_altp2m_mem_access(d, p2m, ap2m, a,
> _gfn(arr[i]));
> + /* If the corresponding mfn is invalid we will just skip it
> */
> + if ( rc && rc != -ESRCH )
> + break;
> + }
> + else
> + {
> + mfn = p2m->get_entry(p2m, arr[i], &t, &_a, 0, NULL, NULL);
> + rc = p2m->set_entry(p2m, arr[i], mfn, PAGE_ORDER_4K, t, a,
> -1);
> + if ( rc )
> + break;
> + }
> }
Where is the preemption handling?
> --- a/xen/common/compat/memory.c
> +++ b/xen/common/compat/memory.c
> @@ -15,7 +15,6 @@ CHECK_TYPE(domid);
> #undef compat_domid_t
> #undef xen_domid_t
>
> -CHECK_mem_access_op;
> CHECK_vmemrange;
You can't just delete this line. Some form of replacement is needed:
Either you need to introduce compat mode translation, or you need
to keep the line and suitably adjust the interface structure (which
might be possible considering there's a [tools interface only] use of
uint64_aligned_t already).
> @@ -76,6 +76,17 @@ int mem_access_memop(unsigned long cmd,
> }
> break;
>
> + case XENMEM_access_op_set_access_sparse:
> + {
> + xen_pfn_t *arr = xmalloc_bytes(sizeof(xen_pfn_t) * mao.nr);
> +
> + // copy_from_guest(arr, mao.pfn_list, mao.nr);
What is this (wrongly C++ style) comment about? I think this really
wasn't meant to be a comment, so RFC or not - how do things work
with this commented out? And where is the error checking for the
allocation (which btw should be xmalloc_array(), but the need for
an allocation here is questionable - the called function would better
retrieve the GFNs one by one).
> + rc = p2m_set_mem_access(d, _gfn(mao.pfn), arr, mao.nr, start_iter,
> + MEMOP_CMD_MASK, mao.access, 0);
Please don't pass mao.pfn here when it's meant to be ignore by
the caller. Use GFN_INVALID instead. And for future extensibility
please check that the caller put some pre-defined pattern here
(not sure whether zero is appropriate in this case).
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |