On Wed, Dec 23, 2009 at 10:59:09AM -0700, Jim Fehlig wrote: > xen-unstable c/s 20685 changed the domctl interface, adding a field to > xen_domctl_getdomaininfo structure. This additional field causes stack > corruption in libvirt. xen-unstable c/s 20711 rightly bumped the domctl > interface version so it is at least possible to handle the new field. > > The attached patch accounts for shr_pages field added to > xen_domctl_getdomaininfo structure. I'm not thrilled about the changes > to all the macros - suggestions for improvement welcomed. > > Tested with domctl version 5 and 6. Yeah, we don't really have much choice there I think, but I would make the macros a bit more forward optimistic, i.e replacing (dom_interface_version == 6 ? with (dom_interface_version >= 6 ? if there is a new bump, the call should not fail because we didn't updated all the macros. otherwise looks fine, ACK to a new patch with this, Daniel > Index: libvirt-0.7.4/src/xen/xen_hypervisor.c > =================================================================== > --- libvirt-0.7.4.orig/src/xen/xen_hypervisor.c > +++ libvirt-0.7.4/src/xen/xen_hypervisor.c > @@ -215,10 +215,26 @@ struct xen_v2d5_getdomaininfo { > }; > typedef struct xen_v2d5_getdomaininfo xen_v2d5_getdomaininfo; > > +struct xen_v2d6_getdomaininfo { > + domid_t domain; /* the domain number */ > + uint32_t flags; /* flags, see before */ > + uint64_t tot_pages ALIGN_64; /* total number of pages used */ > + uint64_t max_pages ALIGN_64; /* maximum number of pages allowed */ > + uint64_t shr_pages ALIGN_64; /* number of shared pages */ > + uint64_t shared_info_frame ALIGN_64; /* MFN of shared_info struct */ > + uint64_t cpu_time ALIGN_64; /* CPU time used */ > + uint32_t nr_online_vcpus; /* Number of VCPUs currently online. */ > + uint32_t max_vcpu_id; /* Maximum VCPUID in use by this domain. */ > + uint32_t ssidref; > + xen_domain_handle_t handle; > +}; > +typedef struct xen_v2d6_getdomaininfo xen_v2d6_getdomaininfo; > + > union xen_getdomaininfo { > struct xen_v0_getdomaininfo v0; > struct xen_v2_getdomaininfo v2; > struct xen_v2d5_getdomaininfo v2d5; > + struct xen_v2d6_getdomaininfo v2d6; > }; > typedef union xen_getdomaininfo xen_getdomaininfo; > > @@ -226,6 +242,7 @@ union xen_getdomaininfolist { > struct xen_v0_getdomaininfo *v0; > struct xen_v2_getdomaininfo *v2; > struct xen_v2d5_getdomaininfo *v2d5; > + struct xen_v2d6_getdomaininfo *v2d6; > }; > typedef union xen_getdomaininfolist xen_getdomaininfolist; > > @@ -263,114 +280,147 @@ typedef struct xen_v2s5_availheap xen_v > #define XEN_GETDOMAININFOLIST_ALLOC(domlist, size) \ > (hypervisor_version < 2 ? \ > (VIR_ALLOC_N(domlist.v0, (size)) == 0) : \ > - (dom_interface_version < 5 ? \ > - (VIR_ALLOC_N(domlist.v2, (size)) == 0) : \ > - (VIR_ALLOC_N(domlist.v2d5, (size)) == 0))) > + (dom_interface_version == 6 ? \ > + (VIR_ALLOC_N(domlist.v2d6, (size)) == 0) : \ > + (dom_interface_version == 5 ? \ > + (VIR_ALLOC_N(domlist.v2d5, (size)) == 0) : \ > + (VIR_ALLOC_N(domlist.v2, (size)) == 0)))) > > #define XEN_GETDOMAININFOLIST_FREE(domlist) \ > (hypervisor_version < 2 ? \ > VIR_FREE(domlist.v0) : \ > - (dom_interface_version < 5 ? \ > - VIR_FREE(domlist.v2) : \ > - VIR_FREE(domlist.v2d5))) > + (dom_interface_version == 6 ? \ > + VIR_FREE(domlist.v2d6) : \ > + (dom_interface_version == 5 ? \ > + VIR_FREE(domlist.v2d5) : \ > + VIR_FREE(domlist.v2)))) > > #define XEN_GETDOMAININFOLIST_CLEAR(domlist, size) \ > (hypervisor_version < 2 ? \ > memset(domlist.v0, 0, sizeof(*domlist.v0) * size) : \ > - (dom_interface_version < 5 ? \ > - memset(domlist.v2, 0, sizeof(*domlist.v2) * size) : \ > - memset(domlist.v2d5, 0, sizeof(*domlist.v2d5) * size))) > + (dom_interface_version == 6 ? \ > + memset(domlist.v2d6, 0, sizeof(*domlist.v2d6) * size) : \ > + (dom_interface_version == 5 ? \ > + memset(domlist.v2d5, 0, sizeof(*domlist.v2d5) * size) : \ > + memset(domlist.v2, 0, sizeof(*domlist.v2) * size)))) > > #define XEN_GETDOMAININFOLIST_DOMAIN(domlist, n) \ > (hypervisor_version < 2 ? \ > domlist.v0[n].domain : \ > - (dom_interface_version < 5 ? \ > - domlist.v2[n].domain : \ > - domlist.v2d5[n].domain)) > + (dom_interface_version == 6 ? \ > + domlist.v2d6[n].domain : \ > + (dom_interface_version == 5 ? \ > + domlist.v2d5[n].domain : \ > + domlist.v2[n].domain))) > > #define XEN_GETDOMAININFOLIST_UUID(domlist, n) \ > (hypervisor_version < 2 ? \ > domlist.v0[n].handle : \ > - (dom_interface_version < 5 ? \ > - domlist.v2[n].handle : \ > - domlist.v2d5[n].handle)) > + (dom_interface_version == 6 ? \ > + domlist.v2d6[n].handle : \ > + (dom_interface_version == 5 ? \ > + domlist.v2d5[n].handle : \ > + domlist.v2[n].handle))) > > #define XEN_GETDOMAININFOLIST_DATA(domlist) \ > (hypervisor_version < 2 ? \ > (void*)(domlist->v0) : \ > - (dom_interface_version < 5 ? \ > - (void*)(domlist->v2) : \ > - (void*)(domlist->v2d5))) > + (dom_interface_version == 6 ? \ > + (void*)(domlist->v2d6) : \ > + (dom_interface_version == 5 ? \ > + (void*)(domlist->v2d5) : \ > + (void*)(domlist->v2)))) > > #define XEN_GETDOMAININFO_SIZE \ > (hypervisor_version < 2 ? \ > sizeof(xen_v0_getdomaininfo) : \ > - (dom_interface_version < 5 ? \ > - sizeof(xen_v2_getdomaininfo) : \ > - sizeof(xen_v2d5_getdomaininfo))) > + (dom_interface_version == 6 ? \ > + sizeof(xen_v2d6_getdomaininfo) : \ > + (dom_interface_version == 5 ? \ > + sizeof(xen_v2d5_getdomaininfo) : \ > + sizeof(xen_v2_getdomaininfo)))) > > #define XEN_GETDOMAININFO_CLEAR(dominfo) \ > (hypervisor_version < 2 ? \ > memset(&(dominfo.v0), 0, sizeof(xen_v0_getdomaininfo)) : \ > - (dom_interface_version < 5 ? \ > - memset(&(dominfo.v2), 0, sizeof(xen_v2_getdomaininfo)) : \ > - memset(&(dominfo.v2d5), 0, sizeof(xen_v2d5_getdomaininfo)))) > + (dom_interface_version == 6 ? \ > + memset(&(dominfo.v2d6), 0, sizeof(xen_v2d6_getdomaininfo)) : \ > + (dom_interface_version == 5 ? \ > + memset(&(dominfo.v2d5), 0, sizeof(xen_v2d5_getdomaininfo)) : \ > + memset(&(dominfo.v2), 0, sizeof(xen_v2_getdomaininfo))))) > > #define XEN_GETDOMAININFO_DOMAIN(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.domain : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.domain : \ > - dominfo.v2d5.domain)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.domain : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.domain : \ > + dominfo.v2.domain))) > > #define XEN_GETDOMAININFO_CPUTIME(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.cpu_time : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.cpu_time : \ > - dominfo.v2d5.cpu_time)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.cpu_time : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.cpu_time : \ > + dominfo.v2.cpu_time))) > + > > #define XEN_GETDOMAININFO_CPUCOUNT(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.nr_online_vcpus : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.nr_online_vcpus : \ > - dominfo.v2d5.nr_online_vcpus)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.nr_online_vcpus : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.nr_online_vcpus : \ > + dominfo.v2.nr_online_vcpus))) > > #define XEN_GETDOMAININFO_MAXCPUID(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.max_vcpu_id : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.max_vcpu_id : \ > - dominfo.v2d5.max_vcpu_id)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.max_vcpu_id : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.max_vcpu_id : \ > + dominfo.v2.max_vcpu_id))) > > #define XEN_GETDOMAININFO_FLAGS(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.flags : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.flags : \ > - dominfo.v2d5.flags)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.flags : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.flags : \ > + dominfo.v2.flags))) > > #define XEN_GETDOMAININFO_TOT_PAGES(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.tot_pages : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.tot_pages : \ > - dominfo.v2d5.tot_pages)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.tot_pages : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.tot_pages : \ > + dominfo.v2.tot_pages))) > > #define XEN_GETDOMAININFO_MAX_PAGES(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.max_pages : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.max_pages : \ > - dominfo.v2d5.max_pages)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.max_pages : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.max_pages : \ > + dominfo.v2.max_pages))) > > #define XEN_GETDOMAININFO_UUID(dominfo) \ > (hypervisor_version < 2 ? \ > dominfo.v0.handle : \ > - (dom_interface_version < 5 ? \ > - dominfo.v2.handle : \ > - dominfo.v2d5.handle)) > + (dom_interface_version == 6 ? \ > + dominfo.v2d6.handle : \ > + (dom_interface_version == 5 ? \ > + dominfo.v2d5.handle : \ > + dominfo.v2.handle))) > > > static int > @@ -2050,6 +2100,12 @@ xenHypervisorInit(void) > DEBUG0("Using hypervisor call v2, sys ver6 dom ver5\n"); > goto done; > } > + /* Xen 4.0 */ > + dom_interface_version = 6; /* XEN_DOMCTL_INTERFACE_VERSION */ > + if (virXen_getvcpusinfo(fd, 0, 0, ipt, NULL, 0) == 0){ > + DEBUG0("Using hypervisor call v2, sys ver6 dom ver6\n"); > + goto done; > + } > } > > hypervisor_version = 1; > -- > Libvir-list mailing list > Libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list