[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFCv3 3/8] xen: introduce XEN_DOMCTL_set_recipient
>>> On 07.10.14 at 15:10, <vkuznets@xxxxxxxxxx> wrote: > New operation sets the 'recipient' domain which will recieve all > memory pages from a particular domain when these pages are freed. > --- a/xen/common/domctl.c > +++ b/xen/common/domctl.c > @@ -1152,6 +1152,33 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) > u_domctl) > } > break; > > + case XEN_DOMCTL_set_recipient: > + { > + struct domain *recipient_dom; > + > + if ( op->u.recipient.recipient == DOMID_INVALID ) > + { > + if ( d->recipient ) > + { > + put_domain(d->recipient); > + } Please drop pointless braces like these and ... > + d->recipient = NULL; > + break; > + } > + > + recipient_dom = get_domain_by_id(op->u.recipient.recipient); > + if ( recipient_dom == NULL ) > + { > + ret = -ESRCH; > + break; > + } > + else > + { > + d->recipient = recipient_dom; > + } ... the pointless else-s/break-s like here. > --- a/xen/common/page_alloc.c > +++ b/xen/common/page_alloc.c > @@ -1707,6 +1707,7 @@ void free_domheap_pages(struct page_info *pg, unsigned > int order) > { > struct domain *d = page_get_owner(pg); > unsigned int i; > + unsigned long mfn, gmfn; > bool_t drop_dom_ref; > > ASSERT(!in_irq()); > @@ -1764,11 +1765,28 @@ void free_domheap_pages(struct page_info *pg, > unsigned int order) > scrub = 1; > } > > - if ( unlikely(scrub) ) > - for ( i = 0; i < (1 << order); i++ ) > - scrub_one_page(&pg[i]); > + if ( !d || !d->recipient || d->recipient->is_dying ) > + { > + if ( unlikely(scrub) ) > + for ( i = 0; i < (1 << order); i++ ) > + scrub_one_page(&pg[i]); > > - free_heap_pages(pg, order); > + free_heap_pages(pg, order); > + } > + else > + { > + mfn = page_to_mfn(pg); > + gmfn = mfn_to_gmfn(d, mfn); > + > + page_set_owner(pg, NULL); > + assign_pages(d->recipient, pg, order, 0); This can fail. > + > + if ( guest_physmap_add_page(d->recipient, gmfn, mfn, order) ) > + { > + gdprintk(XENLOG_INFO, "Failed to add page to domain's > physmap" > + " mfn: %lx\n", mfn); The current domain/vCPU don't matter here afaict, hence no need for gdprintk(). The source and/or recipient domain do matter though, hence printing either or both would seem desirable. The gMFN may be relevant for diagnostic purposes too. Hence e.g. printk(XENLOG_G_INFO "Failed to add MFN %lx (GFN %lx) to Dom%d's physmap\n" mfn, gmfn, d->recipient->domain_id); What's worse though is that you don't guard against XEN_DOMCTL_set_recipient zapping d->recipient. If that really is necessary to be supported, some synchronization will be needed. And finally - what's the intended protocol for the tool stack to know that all pages got transferred (and hence the new domain can be launched)? > --- a/xen/include/public/domctl.h > +++ b/xen/include/public/domctl.h > @@ -965,6 +965,23 @@ struct xen_domctl_vnuma { > typedef struct xen_domctl_vnuma xen_domctl_vnuma_t; > DEFINE_XEN_GUEST_HANDLE(xen_domctl_vnuma_t); > > +/* > + * XEN_DOMCTL_set_recipient - sets the 'recipient' domain which will recieve > + * all the domain's memory after its death or when and memory page from > + * domain's heap is being freed. So this specifically allows for this to happen on a non-dying domain. Why, i.e. what's the intended usage scenario? If not really needed, please remove this and verify in the handling that the source domain is dying. > --- a/xen/include/xen/sched.h > +++ b/xen/include/xen/sched.h > @@ -366,6 +366,7 @@ struct domain > bool_t is_privileged; > /* Which guest this guest has privileges on */ > struct domain *target; > + struct domain *recipient; Please add a brief comment similar to the one for "target". Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |