[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [RFC Patch 2/2] tools/xc_domain_getinfo: Implement sane interface for single domain information.



Now that xc_domain_getinfo_many() exists, implement a rather more sane
interface for xc_domain_getinfo(), under the name xc_domain_getinfo_single(),
which will only return success if the information is for the requested domid.

As can be seen from the patch, only 3 of the in-tree callers correctly check
whether the information they have refers to the correct domain.

There are out-of-tree callers of xc_domain_getinfo, so removing the API is a
little antisocial at this point.

Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
 tools/console/client/main.c                        |    3 +-
 tools/console/daemon/io.c                          |    6 +-
 tools/debugger/kdd/kdd-xen.c                       |    2 +-
 tools/libxc/xc_core.c                              |    2 +-
 tools/libxc/xc_cpuid_x86.c                         |    2 +-
 tools/libxc/xc_domain.c                            |   96 +++++++++++++-------
 tools/libxc/xc_domain_save.c                       |    4 +-
 tools/libxc/xc_offline_page.c                      |    2 +-
 tools/libxc/xc_pagetab.c                           |    3 +-
 tools/libxc/xc_resume.c                            |    4 +-
 tools/libxc/xenctrl.h                              |   12 +++
 tools/misc/xen-hvmcrash.c                          |    4 +-
 tools/misc/xen-lowmemd.c                           |    2 +-
 .../python/xen/lowlevel/checkpoint/libcheckpoint.c |    5 +-
 tools/xenstore/xenstored_domain.c                  |    5 +-
 tools/xentrace/xenctx.c                            |    4 +-
 16 files changed, 97 insertions(+), 59 deletions(-)

diff --git a/tools/console/client/main.c b/tools/console/client/main.c
index 523fc23..ec1211d 100644
--- a/tools/console/client/main.c
+++ b/tools/console/client/main.c
@@ -339,7 +339,8 @@ int main(int argc, char **argv)
                xc_interface *xc_handle = xc_interface_open(0,0,0);
                if (xc_handle == NULL)
                        err(errno, "Could not open xc interface");
-               xc_domain_getinfo(xc_handle, domid, 1, &xcinfo);
+               if (xc_domain_getinfo_single(xc_handle, domid, &xcinfo) != 0)
+                       err(errno, "Unable to get domain information");
                /* default to pv console for pv guests and serial for hvm 
guests */
                if (xcinfo.hvm)
                        type = CONSOLE_SERIAL;
diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index ba9a2bd..0f37188 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -251,13 +251,9 @@ static void buffer_advance(struct buffer *buffer, size_t 
len)
 
 static bool domain_is_valid(int domid)
 {
-       bool ret;
        xc_dominfo_t info;
 
-       ret = (xc_domain_getinfo(xc, domid, 1, &info) == 1 &&
-              info.domid == domid);
-               
-       return ret;
+       return xc_domain_getinfo_single(xc, domid, &info) == 0;
 }
 
 static int create_hv_log(void)
diff --git a/tools/debugger/kdd/kdd-xen.c b/tools/debugger/kdd/kdd-xen.c
index 4fbea7d..9ebc3f1 100644
--- a/tools/debugger/kdd/kdd-xen.c
+++ b/tools/debugger/kdd/kdd-xen.c
@@ -593,7 +593,7 @@ kdd_guest *kdd_guest_init(char *arg, FILE *log, int 
verbosity)
     g->domid = domid;
 
     /* Check that the domain exists and is HVM */
-    if (xc_domain_getinfo(xch, domid, 1, &info) != 1 || !info.hvm)
+    if (xc_domain_getinfo_single(xch, domid, &info) != 0 || !info.hvm)
         goto err;
 
     snprintf(g->id, (sizeof g->id) - 1, 
diff --git a/tools/libxc/xc_core.c b/tools/libxc/xc_core.c
index 4207eed..66f7313 100644
--- a/tools/libxc/xc_core.c
+++ b/tools/libxc/xc_core.c
@@ -491,7 +491,7 @@ xc_domain_dumpcore_via_callback(xc_interface *xch,
         goto out;
     }
 
-    if ( xc_domain_getinfo(xch, domid, 1, &info) != 1 )
+    if ( xc_domain_getinfo_single(xch, domid, &info) != 0 )
     {
         PERROR("Could not get info for domain");
         goto out;
diff --git a/tools/libxc/xc_cpuid_x86.c b/tools/libxc/xc_cpuid_x86.c
index fa47787..d18f45e 100644
--- a/tools/libxc/xc_cpuid_x86.c
+++ b/tools/libxc/xc_cpuid_x86.c
@@ -557,7 +557,7 @@ static int xc_cpuid_policy(
 {
     xc_dominfo_t        info;
 
-    if ( xc_domain_getinfo(xch, domid, 1, &info) == 0 )
+    if ( xc_domain_getinfo_single(xch, domid, &info) != 0 )
         return -EINVAL;
 
     if ( info.hvm )
diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
index e49dfc2..da65b2c 100644
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -270,6 +270,69 @@ out:
     return ret;
 }
 
+static void xc_domaininfo_to_dominfo(const xc_domaininfo_t *src,
+                                     xc_dominfo_t *dst)
+{
+    dst->dying    = !!(src->flags & XEN_DOMINF_dying);
+    dst->shutdown = !!(src->flags & XEN_DOMINF_shutdown);
+    dst->paused   = !!(src->flags & XEN_DOMINF_paused);
+    dst->blocked  = !!(src->flags & XEN_DOMINF_blocked);
+    dst->running  = !!(src->flags & XEN_DOMINF_running);
+    dst->hvm      = !!(src->flags & XEN_DOMINF_hvm_guest);
+    dst->debugged = !!(src->flags & XEN_DOMINF_debugged);
+
+    dst->shutdown_reason =
+        (src->flags>>XEN_DOMINF_shutdownshift) &
+        XEN_DOMINF_shutdownmask;
+
+    if ( dst->shutdown && (dst->shutdown_reason == SHUTDOWN_crash) )
+    {
+        dst->shutdown = 0;
+        dst->crashed  = 1;
+    }
+
+    dst->ssidref  = src->ssidref;
+    dst->nr_pages = src->tot_pages;
+    dst->nr_outstanding_pages = src->outstanding_pages;
+    dst->nr_shared_pages = src->shr_pages;
+    dst->nr_paged_pages = src->paged_pages;
+    dst->max_memkb = src->max_pages << (PAGE_SHIFT-10);
+    dst->shared_info_frame = src->shared_info_frame;
+    dst->cpu_time = src->cpu_time;
+    dst->nr_online_vcpus = src->nr_online_vcpus;
+    dst->max_vcpu_id = src->max_vcpu_id;
+    dst->cpupool = src->cpupool;
+
+    memcpy(dst->handle, src->handle,
+           sizeof(xen_domain_handle_t));
+}
+
+int xc_domain_getinfo_single(xc_interface *xch,
+                             uint32_t domid,
+                             xc_dominfo_t *info)
+{
+    DECLARE_DOMCTL;
+    int rc = 0;
+
+    domctl.cmd = XEN_DOMCTL_getdomaininfo;
+    domctl.domain = (domid_t)domid;
+
+    rc = do_domctl(xch, &domctl);
+    if ( rc )
+        return rc;
+
+    if ( domctl.domain != domid ) {
+        errno = ESRCH;
+        return -1;
+    }
+
+    memset(info, 0, sizeof *info);
+
+    info->domid = domctl.domain;
+    xc_domaininfo_to_dominfo(&domctl.u.getdomaininfo, info);
+
+    return 0;
+}
 
 int xc_domain_getinfo_many(xc_interface *xch,
                            uint32_t first_domid,
@@ -291,38 +354,7 @@ int xc_domain_getinfo_many(xc_interface *xch,
             break;
         info->domid      = (uint16_t)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->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;
-
-        memcpy(info->handle, domctl.u.getdomaininfo.handle,
-               sizeof(xen_domain_handle_t));
+        xc_domaininfo_to_dominfo(&domctl.u.getdomaininfo, info);
 
         next_domid = (uint16_t)domctl.domain + 1;
         info++;
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index fbc15e9..b42c1c5 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -365,7 +365,7 @@ static int suspend_and_state(int (*suspend)(void*), void* 
data,
         return -1;
     }
 
-    if ( (xc_domain_getinfo(xch, dom, 1, info) != 1) ||
+    if ( (xc_domain_getinfo_single(xch, dom, info) != 0) ||
          !info->shutdown || (info->shutdown_reason != SHUTDOWN_suspend) )
     {
         ERROR("Domain not in suspended state");
@@ -919,7 +919,7 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t 
dom, uint32_t max_iter
         return 1;
     }
 
-    if ( xc_domain_getinfo(xch, dom, 1, &info) != 1 )
+    if ( xc_domain_getinfo_single(xch, dom, &info) != 0 )
     {
         PERROR("Could not get domain info");
         return 1;
diff --git a/tools/libxc/xc_offline_page.c b/tools/libxc/xc_offline_page.c
index 36b9812..0405a3f 100644
--- a/tools/libxc/xc_offline_page.c
+++ b/tools/libxc/xc_offline_page.c
@@ -557,7 +557,7 @@ int xc_exchange_page(xc_interface *xch, int domid, 
xen_pfn_t mfn)
     uint32_t status;
     xen_pfn_t new_mfn, gpfn;
 
-    if ( xc_domain_getinfo(xch, domid, 1, &info) != 1 )
+    if ( xc_domain_getinfo_single(xch, domid, &info) != 0 )
     {
         ERROR("Could not get domain info");
         return -EFAULT;
diff --git a/tools/libxc/xc_pagetab.c b/tools/libxc/xc_pagetab.c
index 27c4e9f..387139b 100644
--- a/tools/libxc/xc_pagetab.c
+++ b/tools/libxc/xc_pagetab.c
@@ -35,8 +35,7 @@ unsigned long xc_translate_foreign_address(xc_interface *xch, 
uint32_t dom,
     int size, level, pt_levels = 2;
     void *map;
 
-    if (xc_domain_getinfo(xch, dom, 1, &dominfo) != 1 
-        || dominfo.domid != dom)
+    if (xc_domain_getinfo_single(xch, dom, &dominfo) != 0)
         return 0;
 
     /* What kind of paging are we dealing with? */
diff --git a/tools/libxc/xc_resume.c b/tools/libxc/xc_resume.c
index 1c43ec6..30de9bc 100644
--- a/tools/libxc/xc_resume.c
+++ b/tools/libxc/xc_resume.c
@@ -46,7 +46,7 @@ static int modify_returncode(xc_interface *xch, uint32_t 
domid)
     struct domain_info_context *dinfo = &_dinfo;
     int rc;
 
-    if ( xc_domain_getinfo(xch, domid, 1, &info) != 1 )
+    if ( xc_domain_getinfo_single(xch, domid, &info) != 0 )
     {
         PERROR("Could not get domain info");
         return -1;
@@ -131,7 +131,7 @@ static int xc_domain_resume_any(xc_interface *xch, uint32_t 
domid)
     xen_pfn_t *p2m = NULL;
 #endif
 
-    if ( xc_domain_getinfo(xch, domid, 1, &info) != 1 )
+    if ( xc_domain_getinfo_single(xch, domid, &info) != 0 )
     {
         PERROR("Could not get domain info");
         return rc;
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 86abec7..6f795e1 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -562,6 +562,18 @@ int xc_vcpu_getaffinity(xc_interface *xch,
                         xc_cpumap_t cpumap);
 
 /**
+ * This function will return information about a single domain.
+ *
+ * @parm xch a handle to an open hypervisor interface
+ * @parm domid the domain to get information information from.
+ * @parm info an xc_dominfo_t structure to hold the information.
+ * @return 0 on success or -1 on error
+ */
+int xc_domain_getinfo_single(xc_interface *xch,
+                             uint32_t domid,
+                             xc_dominfo_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
diff --git a/tools/misc/xen-hvmcrash.c b/tools/misc/xen-hvmcrash.c
index 4f0dabc..bdd60fc 100644
--- a/tools/misc/xen-hvmcrash.c
+++ b/tools/misc/xen-hvmcrash.c
@@ -66,8 +66,8 @@ main(int argc, char **argv)
         exit(1);
     }
 
-    ret = xc_domain_getinfo(xch, domid, 1, &dominfo);
-    if (ret < 0) {
+    ret = xc_domain_getinfo_single(xch, domid, &dominfo);
+    if (ret != 0) {
         perror("xc_domain_getinfo");
         exit(1);
     }
diff --git a/tools/misc/xen-lowmemd.c b/tools/misc/xen-lowmemd.c
index 82ffd75..d5b6eb0 100644
--- a/tools/misc/xen-lowmemd.c
+++ b/tools/misc/xen-lowmemd.c
@@ -57,7 +57,7 @@ void handle_low_mem(void)
         return;
     diff = THRESHOLD_PG - free_pages; 
 
-    if (xc_domain_getinfo(xch, 0, 1, &dom0_info) < 1)
+    if (xc_domain_getinfo_single(xch, 0, &dom0_info) != 0)
     {
         perror("Failed to get dom0 info");
         return;
diff --git a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c 
b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
index 01c0d47..cacdfee 100644
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
@@ -97,7 +97,7 @@ int checkpoint_open(checkpoint_state* s, unsigned int domid)
        return -1;
     }
 
-    if (xc_domain_getinfo(s->xch, s->domid, 1, &dominfo) < 0) {
+    if (xc_domain_getinfo_single(s->xch, s->domid, &dominfo) != 0) {
        checkpoint_close(s);
        s->errstr = "could not get domain info";
 
@@ -428,8 +428,7 @@ static int check_shutdown(checkpoint_state* s) {
            break;
     }
 
-    if (xc_domain_getinfo(s->xch, s->domid, 1, &info) != 1
-       || info.domid != s->domid) {
+    if (xc_domain_getinfo_single(s->xch, s->domid, &info) != 0) {
        snprintf(errbuf, sizeof(errbuf),
                 "error getting info for domain %u", s->domid);
        s->errstr = errbuf;
diff --git a/tools/xenstore/xenstored_domain.c 
b/tools/xenstore/xenstored_domain.c
index bf83d58..e626593 100644
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -217,9 +217,8 @@ static void domain_cleanup(void)
        int notify = 0;
 
        list_for_each_entry_safe(domain, tmp, &domains, list) {
-               if (xc_domain_getinfo(*xc_handle, domain->domid, 1,
-                                     &dominfo) == 1 &&
-                   dominfo.domid == domain->domid) {
+               if (xc_domain_getinfo_single(*xc_handle, domain->domid,
+                                     &dominfo) == 0) {
                        if ((dominfo.crashed || dominfo.shutdown)
                            && !domain->shutdown) {
                                domain->shutdown = 1;
diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c
index 060e480..e1ca581 100644
--- a/tools/xentrace/xenctx.c
+++ b/tools/xentrace/xenctx.c
@@ -896,8 +896,8 @@ int main(int argc, char **argv)
         exit(-1);
     }
 
-    ret = xc_domain_getinfo(xenctx.xc_handle, xenctx.domid, 1, 
&xenctx.dominfo);
-    if (ret < 0) {
+    ret = xc_domain_getinfo_single(xenctx.xc_handle, xenctx.domid, 
&xenctx.dominfo);
+    if (ret != 0) {
         perror("xc_domain_getinfo");
         exit(-1);
     }
-- 
1.7.10.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.