@@ -444,28 +444,6 @@ typedef struct xc_core_header {
* DOMAIN MANAGEMENT FUNCTIONS
*/
-typedef struct xc_dominfo {
- uint32_t domid;
- uint32_t ssidref;
- unsigned int dying:1, crashed:1, shutdown:1,
- paused:1, blocked:1, running:1,
- hvm:1, debugged:1, xenstore:1, hap:1;
- unsigned int shutdown_reason; /* only meaningful if shutdown==1 */
- unsigned long nr_pages; /* current number, not maximum */
- unsigned long nr_outstanding_pages;
- unsigned long nr_shared_pages;
- unsigned long nr_paged_pages;
- unsigned long shared_info_frame;
- uint64_t cpu_time;
- unsigned long max_memkb;
- unsigned int nr_online_vcpus;
- unsigned int max_vcpu_id;
- xen_domain_handle_t handle;
- unsigned int cpupool;
- uint8_t gpaddr_bits;
- struct xen_arch_domainconfig arch_config;
-} xc_dominfo_t;
-
typedef xen_domctl_getdomaininfo_t xc_domaininfo_t;
static inline unsigned int dominfo_shutdown_reason(const xc_domaininfo_t *info)
@@ -720,27 +698,6 @@ int xc_domain_getinfo_single(xc_interface *xch,
uint32_t domid,
xc_domaininfo_t *info);
-/**
- * This function will return information about one or more domains. It is
- * designed to iterate over the list of domains. If a single domain is
- * requested, this function will return the next domain in the list - if
- * one exists. It is, therefore, important in this case to make sure the
- * domain requested was the one returned.
- *
- * @parm xch a handle to an open hypervisor interface
- * @parm first_domid the first domain to enumerate information from. Domains
- * are currently enumerate in order of creation.
- * @parm max_doms the number of elements in info
- * @parm info an array of max_doms size that will contain the information for
- * the enumerated domains.
- * @return the number of domains enumerated or -1 on error
- */
-int xc_domain_getinfo(xc_interface *xch,
- uint32_t first_domid,
- unsigned int max_doms,
- xc_dominfo_t *info);
-
-
/**
* This function will set the execution context for the specified vcpu.
*
@@ -357,84 +357,12 @@ int xc_domain_getinfo_single(xc_interface *xch,
if ( do_domctl(xch, &domctl) < 0 )
return -1;
- if ( domctl.u.getdomaininfo.domain != domid ) {
- errno = ESRCH;
- return -1;
- }
-
if ( info )
*info = domctl.u.getdomaininfo;
return 0;
}
-int xc_domain_getinfo(xc_interface *xch,
- uint32_t first_domid,
- unsigned int max_doms,
- xc_dominfo_t *info)
-{
- unsigned int nr_doms;
- uint32_t next_domid = first_domid;
- DECLARE_DOMCTL;
- int rc = 0;
-
- memset(info, 0, max_doms*sizeof(xc_dominfo_t));
-
- for ( nr_doms = 0; nr_doms < max_doms; nr_doms++ )
- {
- domctl.cmd = XEN_DOMCTL_getdomaininfo;
- domctl.domain = next_domid;
- if ( (rc = do_domctl(xch, &domctl)) < 0 )
- break;
- info->domid = domctl.domain;
-
- info->dying = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_dying);
- info->shutdown = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_shutdown);
- info->paused = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_paused);
- info->blocked = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_blocked);
- info->running = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_running);
- info->hvm = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_hvm_guest);
- info->debugged = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_debugged);
- info->xenstore = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_xs_domain);
- info->hap = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_hap);
-
- info->shutdown_reason =
- (domctl.u.getdomaininfo.flags>>XEN_DOMINF_shutdownshift) &
- XEN_DOMINF_shutdownmask;
-
- if ( info->shutdown && (info->shutdown_reason == SHUTDOWN_crash) )
- {
- info->shutdown = 0;
- info->crashed = 1;
- }
-
- info->ssidref = domctl.u.getdomaininfo.ssidref;
- info->nr_pages = domctl.u.getdomaininfo.tot_pages;
- info->nr_outstanding_pages = domctl.u.getdomaininfo.outstanding_pages;
- info->nr_shared_pages = domctl.u.getdomaininfo.shr_pages;
- info->nr_paged_pages = domctl.u.getdomaininfo.paged_pages;
- info->max_memkb = domctl.u.getdomaininfo.max_pages << (PAGE_SHIFT-10);
- info->shared_info_frame = domctl.u.getdomaininfo.shared_info_frame;
- info->cpu_time = domctl.u.getdomaininfo.cpu_time;
- info->nr_online_vcpus = domctl.u.getdomaininfo.nr_online_vcpus;
- info->max_vcpu_id = domctl.u.getdomaininfo.max_vcpu_id;
- info->cpupool = domctl.u.getdomaininfo.cpupool;
- info->gpaddr_bits = domctl.u.getdomaininfo.gpaddr_bits;
- info->arch_config = domctl.u.getdomaininfo.arch_config;
-
- memcpy(info->handle, domctl.u.getdomaininfo.handle,
- sizeof(xen_domain_handle_t));
-
- next_domid = (uint16_t)domctl.domain + 1;
- info++;
- }
-
- if ( nr_doms == 0 )
- return rc;
-
- return nr_doms;
-}
-
int xc_domain_getinfolist(xc_interface *xch,
uint32_t first_domain,
unsigned int max_domains,
@@ -178,7 +178,7 @@ int xc_dom_boot_image(struct xc_dom_image *dom)
{
xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
"%s: getdomaininfo failed (errno=%d)",
- __FUNCTION__, rc, errno);
+ __FUNCTION__, errno);
return -1;
}
dom->shared_info_mfn = info.shared_info_frame;
@@ -314,7 +314,7 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
/* fall through */
default:
d = rcu_lock_domain_by_id(op->domain);
- if ( !d && op->cmd != XEN_DOMCTL_getdomaininfo )
+ if ( !d )
return -ESRCH;
}
@@ -534,42 +534,14 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
case XEN_DOMCTL_getdomaininfo:
{
- domid_t dom = DOMID_INVALID;
-
- if ( !d )
- {
- ret = -EINVAL;
- if ( op->domain >= DOMID_FIRST_RESERVED )
- break;
-
- rcu_read_lock(&domlist_read_lock);
-
- dom = op->domain;
- for_each_domain ( d )
- if ( d->domain_id >= dom )
- break;
- }
-
- ret = -ESRCH;
- if ( d == NULL )
- goto getdomaininfo_out;
-
ret = xsm_getdomaininfo(XSM_HOOK, d);
if ( ret )
- goto getdomaininfo_out;
+ break;
getdomaininfo(d, &op->u.getdomaininfo);
op->domain = op->u.getdomaininfo.domain;
copyback = 1;
-
- getdomaininfo_out:
- /* When d was non-NULL upon entry, no cleanup is needed. */
- if ( dom == DOMID_INVALID )
- break;
-
- rcu_read_unlock(&domlist_read_lock);
- d = NULL;
break;
}
It previously mimicked the getdomaininfo sysctl semantics by returning the first domid higher than the requested domid that does exist. This unintuitive behaviour causes quite a few mistakes and makes the call needlessly slow in its error path. This patch removes the fallback search, returning -ESRCH if the requested domain doesn't exist. Domain discovery can still be done through the sysctl interface as that performs a linear search on the list of domains. With this modification the xc_domain_getinfo() function is deprecated and removed to make sure it's not mistakenly used expecting the old behaviour. The new xc wrapper is xc_domain_getinfo_single(). All previous callers of xc_domain_getinfo() have been updated to use xc_domain_getinfo_single() or xc_domain_getinfolist() instead. This also means xc_dominfo_t is no longer used by anything and can be purged. Resolves: xen-project/xen#105 Signed-off-by: Alejandro Vallejo <alejandro.vallejo@cloud.com> --- Cc: Andrew Cooper <andrew.cooper3@citrix.com> Cc: George Dunlap <george.dunlap@citrix.com> Cc: Jan Beulich <jbeulich@suse.com> Cc: Julien Grall <julien@xen.org> Cc: Stefano Stabellini <sstabellini@kernel.org> Cc: Wei Liu <wl@xen.org> Cc: Anthony PERARD <anthony.perard@citrix.com> Cc: Juergen Gross <jgross@suse.com> --- tools/include/xenctrl.h | 43 -------------------- tools/libs/ctrl/xc_domain.c | 72 ---------------------------------- tools/libs/guest/xg_dom_boot.c | 2 +- xen/common/domctl.c | 32 +-------------- 4 files changed, 3 insertions(+), 146 deletions(-)