|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 5/6] ioreq-server: add support for multiple servers
On Mon, 2014-03-17 at 12:25 +0000, Paul Durrant wrote:
> > drivers in the guest.
> > > This parameter only takes effect when device_model_version=qemu-xen.
> > > See F<docs/misc/pci-device-reservations.txt> for more information.
> > >
> > > +=item B<secondary_device_emulators=NUMBER>
> > > +
> > > +If a number of secondary device emulators (i.e. in addition to
> > > +qemu-xen or qemu-xen-traditional) are to be invoked to support the
> > > +guest then this parameter can be set with the count of how many are
> > > +to be used. The default value is zero.
> >
> > This is an odd thing to expose to the user. Surely (lib)xl should be
> > launching these things while building the domain and therefore know how
> > many there are the config options should be things like
> > "use_split_dm_for_foo=1" or device_emulators = ["/usr/bin/first-dm",
> > "/usr/local/bin/second-dm"] or something.
> >
>
> As George says, I donât want to restrict the only way to kick off
> emulators to being libxl at this point.
OK. There's conversely no support here for libxl launching them either
though?
>
> > > +
> > > =back
> > >
> > > =head2 Device-Model Options
> > > diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
> > > index 369c3f3..dfa905b 100644
> > > --- a/tools/libxc/xc_domain.c
> > > +++ b/tools/libxc/xc_domain.c
> > > +int xc_hvm_get_ioreq_server_info(xc_interface *xch,
> > > + domid_t domid,
> > > + ioservid_t id,
> > > + xen_pfn_t *pfn,
> > > + xen_pfn_t *buf_pfn,
> > > + evtchn_port_t *buf_port)
> > > +{
> > > + DECLARE_HYPERCALL;
> > > + DECLARE_HYPERCALL_BUFFER(xen_hvm_get_ioreq_server_info_t,
> > arg);
> > > + int rc;
> > > +
> > > + arg = xc_hypercall_buffer_alloc(xch, arg, sizeof(*arg));
> > > + if ( arg == NULL )
> > > + return -1;
> > > +
> > > + hypercall.op = __HYPERVISOR_hvm_op;
> > > + hypercall.arg[0] = HVMOP_get_ioreq_server_info;
> > > + hypercall.arg[1] = HYPERCALL_BUFFER_AS_ARG(arg);
> > > + arg->domid = domid;
> > > + arg->id = id;
> > > + rc = do_xen_hypercall(xch, &hypercall);
> > > + if ( rc != 0 )
> > > + goto done;
> > > +
> > > + if ( pfn )
> > > + *pfn = arg->pfn;
> > > +
> > > + if ( buf_pfn )
> > > + *buf_pfn = arg->buf_pfn;
> > > +
> > > + if ( buf_port )
> > > + *buf_port = arg->buf_port;
> >
> > This looks a bit like this function should take a
> > xen_hvm_get_ioreq_server_info_t* and use the bounce buffering stuff.
> > Unless there is some desire to hide that struct from the callers
> > perhaps?
> >
>
> Well, I guess the caller could do the marshalling but isn't it neater
> to hide it all in libxenctrl internals? I don't know what the general
> philosophy behind libxenctrl apis is. Most of the other functions seem
> to take an xc_interface and a bunch of args rather than a single
> struct.
I guess it depends what the caller is most likely to do -- if it uses
them immediately and throws them away then this way is fine, if it's
going to pass them around then the existing struct seems useful. I
presume it is the former or you'd have written it the other way, in
which case this is fine.
> > > diff --git a/tools/libxc/xc_domain_restore.c
> > b/tools/libxc/xc_domain_restore.c
> > > index 1f6ce50..3116653 100644
> > > --- a/tools/libxc/xc_domain_restore.c
> > > +++ b/tools/libxc/xc_domain_restore.c
> > > @@ -746,6 +746,7 @@ typedef struct {
> > > uint64_t acpi_ioport_location;
> > > uint64_t viridian;
> > > uint64_t vm_generationid_addr;
> > > + uint64_t nr_ioreq_servers;
> >
> > This makes me wonder: what happens if the source and target hosts do
> > different amounts of disaggregation? Perhaps in Xen N+1 we split some
> > additional component out into its own process?
> >
> > This is going to be complex with the allocation of space for special
> > pages, isn't it?
> >
>
> As long as we have enough special pages then is it complex?
The "have enough" is where the complexity comes in though. If Xen
version X needed N special pages and Xen X+1 needs N+2 pages then we
have a tricky situation because people may well configure the guest with
N.
> All Xen needs to know is the base ioreq server pfn and how many the
> VM has. I'm overloading the existing HVM param as the base and then
> adding a new one for the count. George (as I understand it) suggested
> leaving the old params alone, grandfathering them in for the catch-all
> server, and then having a new area for secondary emulators. I'm happy
> with that and, as long as suitable save records were introduced for
> any other dissag. work, then I don't think there's any conflict.
> > > +
> > > + chunk.id = XC_SAVE_ID_HVM_NR_IOREQ_SERVERS;
> > > + chunk.data = 0;
> > > + xc_get_hvm_param(xch, dom, HVM_PARAM_NR_IOREQ_SERVERS,
> > > + (unsigned long *)&chunk.data);
> > > +
> > > + if ( (chunk.data != 0) &&
> >
> > Can this ever be 0 for an HVM guest?
> >
>
> I was assuming it would 0 for a guest migrated in from a host that did
> not know about secondary emulators.
Would that host even include this chunk type at all?
> > > + evtchn_port_t buf_port; /* OUT - buf ioreq port */
> > > +};
> > > +typedef struct xen_hvm_get_ioreq_server_info
> > xen_hvm_get_ioreq_server_info_t;
> > > +DEFINE_XEN_GUEST_HANDLE(xen_hvm_get_ioreq_server_info_t);
> > > +
> > > +#define HVMOP_map_io_range_to_ioreq_server 19
> > > +struct xen_hvm_map_io_range_to_ioreq_server {
> > > + domid_t domid; /* IN - domain to be serviced */
> > > + ioservid_t id; /* IN - handle from
> > HVMOP_register_ioreq_server */
> > > + int is_mmio; /* IN - MMIO or port IO? */
> >
> > Do we normally make this distinction via two different hypercalls?
> >
>
> I don't really think there's much precedent at an API layer. There's
> code inside Xen which overloads portio and mmio to some degree.
XEN_DOMCTL_ioport_mapping vs. XEN_DOMCTL_memory_mapping is the closest
analogue I think.
It's not really clear to me when DOMCTL vs HVMOP is appropriate, maybe
one of the h/v side folks will comment.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |