
On Fri, Mar 30, 2007 at 02:27:46PM +0100, Richard W.M. Jones wrote:
Ignore the just posted "first complete version". It had some stupid stuff going on with connection opens. This version fixes all that, and passes 'make check'.
/* These dispatch functions follow the model used historically * by libvirt.c -- trying each low-level Xen driver in turn * until one succeeds. However since we know what low-level * drivers can perform which functions, it is probably better * in future to optimise these dispatch functions to just call * the single function (or small number of appropriate functions) * in the low level drivers directly. */
For now, keeping the same internal driver model will help debugging any issues in this conversion. I agree that we should later re-factor this further to explicitly call the appropriate methods directly because I don't think merely iterating over driver is particularly useful. For any given libvirt method is is easy to define exactly how we should fetch the info. The current situation is a little odd - if we doing 'pause' then we should always just go straight to the hypervisor. If that fails there is no point trying any others because both XenD / XenStored ultimately call into the hypervisor too. I don't see the point if the XenStoreD driver at all. It is lower priority than the XenD driver is, and since XenD driver has 100% coverage of all APIs there is no circumstance in which the XenStoreD driver will ever be called. There's a couple of helper methods in the xenstored.c file which are used directly be xend.c / xml.c, but aside from that the rest is 100% untested by any of us.
static int xenUnifiedDomainSuspend (virDomainPtr dom) { int i;
/* Try non-hypervisor methods first, then hypervisor direct method * as a last resort. */ for (i = 0; i < nb_drivers; ++i) if (i != hypervisor_offset && drivers[i]->domainSuspend && drivers[i]->domainSuspend (dom) == 0) return 0;
if (drivers[hypervisor_offset]->domainSuspend && drivers[hypervisor_offset]->domainSuspend (dom) == 0) return 0;
return -1; }
Why do we try the non-hypervisor method first ? What does XenD give us that we don't get just by going to the HV immediately, aside from higher overheads. Likewise for Resume/Destroy/SetVCPUs. If there is a compelling reason why we must call XenD, then we shouldn't try to fallback to the HV at all. If there isn't a compelling reason, then we should try HV first. Was this how the existing code already worked, if so i guess we should leave as is until we can cleanup like I described earlier ? If any knows why, we should at least comment this voodoo...
+static int +qemuNetworkClose (virConnectPtr conn ATTRIBUTE_UNUSED) +{ + /* NB: This will fail to close the connection properly + * qemuRegister is changed so that it only registers the + * network (not the connection driver). + */ + return 0; +}
I'm not sure what you mean by this comment ? I'm fairly sure we need to have code in qemuNetworkClose() though to close the QEMU socket when the XenD driver is used QEMU driver for the networking APIs. Apart from the 2 questions about suspend/resume/destroy APIs and the QEMU networking code, this patch looks fine for inclusion to me. Although it is a big patch, it is basically a straight forward re-factoring with no major operational changes aside from in the open/close routines. I'm going to actually try it out for real shortly.... Dan. -- |=- Red Hat, Engineering, Emerging Technologies, Boston. +1 978 392 2496 -=| |=- Perl modules: http://search.cpan.org/~danberr/ -=| |=- Projects: http://freshmeat.net/~danielpb/ -=| |=- GnuPG: 7D3B9505 F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 -=|