]> xenbits.xensource.com Git - xen.git/commitdiff
libxl: handle errors from xc_sharing_* info functions
authorIan Campbell <Ian.Campbell@citrix.com>
Fri, 14 Sep 2012 09:02:46 +0000 (10:02 +0100)
committerIan Campbell <Ian.Campbell@citrix.com>
Fri, 14 Sep 2012 09:02:46 +0000 (10:02 +0100)
On a 32 bit hypervisor xl info currently reports:
sharing_freed_memory   : 72057594037927935
sharing_used_memory    : 72057594037927935

Eat the ENOSYS and turn it into 0. Log and propagate other errors.

I don't have a 32 bit system handy, so tested on x86_64 with a libxc
hacked to return -ENOSYS and -EINVAL.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
Acked-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
tools/libxl/libxl.c

index 0857c48aee732044a57e19266bf8482fd22c961a..5d2648307334a5a69f94bf1c1ca43054c462e663 100644 (file)
@@ -3622,6 +3622,7 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo)
 {
     xc_physinfo_t xcphysinfo = { 0 };
     int rc;
+    long l;
 
     rc = xc_physinfo(ctx->xch, &xcphysinfo);
     if (rc != 0) {
@@ -3636,8 +3637,24 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo)
     physinfo->total_pages = xcphysinfo.total_pages;
     physinfo->free_pages = xcphysinfo.free_pages;
     physinfo->scrub_pages = xcphysinfo.scrub_pages;
-    physinfo->sharing_freed_pages = xc_sharing_freed_pages(ctx->xch);
-    physinfo->sharing_used_frames = xc_sharing_used_frames(ctx->xch);
+    l = xc_sharing_freed_pages(ctx->xch);
+    if (l == -ENOSYS) {
+        l = 0;
+    } else if (l < 0) {
+        LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, l,
+                            "getting sharing freed pages");
+        return ERROR_FAIL;
+    }
+    physinfo->sharing_freed_pages = l;
+    l = xc_sharing_used_frames(ctx->xch);
+    if (l == -ENOSYS) {
+        l = 0;
+    } else if (l < 0) {
+        LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, l,
+                            "getting sharing used frames");
+        return ERROR_FAIL;
+    }
+    physinfo->sharing_used_frames = l;
     physinfo->nr_nodes = xcphysinfo.nr_nodes;
     memcpy(physinfo->hw_cap,xcphysinfo.hw_cap, sizeof(physinfo->hw_cap));