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

[Xen-changelog] [xen-unstable] x86 libxc: Fix mlock sizes in libxc around vcpu context hypercalls



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1207754686 -3600
# Node ID c99dee5e44d68d6a0a5251da86e70cf842160dd0
# Parent  64f81cd158d44c837b8f8b25a0a7e2b84083c0e4
x86 libxc: Fix mlock sizes in libxc around vcpu context hypercalls
backing off to the old behaviour if we fail.

Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxx>
---
 tools/libxc/xc_domain.c |   31 +++++++++++++++++++++++++------
 1 files changed, 25 insertions(+), 6 deletions(-)

diff -r 64f81cd158d4 -r c99dee5e44d6 tools/libxc/xc_domain.c
--- a/tools/libxc/xc_domain.c   Wed Apr 09 16:11:34 2008 +0100
+++ b/tools/libxc/xc_domain.c   Wed Apr 09 16:24:46 2008 +0100
@@ -7,6 +7,7 @@
  */
 
 #include "xc_private.h"
+#include "xg_save_restore.h"
 #include <xen/memory.h>
 #include <xen/hvm/hvm_op.h>
 
@@ -301,18 +302,27 @@ int xc_vcpu_getcontext(int xc_handle,
 {
     int rc;
     DECLARE_DOMCTL;
+    size_t sz = sizeof(vcpu_guest_context_either_t);
 
     domctl.cmd = XEN_DOMCTL_getvcpucontext;
     domctl.domain = (domid_t)domid;
     domctl.u.vcpucontext.vcpu   = (uint16_t)vcpu;
     set_xen_guest_handle(domctl.u.vcpucontext.ctxt, ctxt);
 
-    if ( (rc = lock_pages(ctxt, sizeof(*ctxt))) != 0 )
-        return rc;
+    /*
+     * We may be asked to lock either a 32-bit or a 64-bit context. Lock the
+     * larger of the two if possible, otherwise fall back to native size.
+     */
+    if ( (rc = lock_pages(ctxt, sz)) != 0 )
+    {
+        sz = sizeof(*ctxt);
+        if ( (rc = lock_pages(ctxt, sz)) != 0 )
+            return rc;
+    }
 
     rc = do_domctl(xc_handle, &domctl);
 
-    unlock_pages(ctxt, sizeof(*ctxt));
+    unlock_pages(ctxt, sz);
 
     return rc;
 }
@@ -620,19 +630,28 @@ int xc_vcpu_setcontext(int xc_handle,
 {
     DECLARE_DOMCTL;
     int rc;
+    size_t sz = sizeof(vcpu_guest_context_either_t);
 
     domctl.cmd = XEN_DOMCTL_setvcpucontext;
     domctl.domain = domid;
     domctl.u.vcpucontext.vcpu = vcpu;
     set_xen_guest_handle(domctl.u.vcpucontext.ctxt, ctxt);
 
-    if ( (ctxt != NULL) && ((rc = lock_pages(ctxt, sizeof(*ctxt))) != 0) )
-        return rc;
+    /*
+     * We may be asked to lock either a 32-bit or a 64-bit context. Lock the
+     * larger of the two if possible, otherwise fall back to native size.
+     */
+    if ( (ctxt != NULL) && (rc = lock_pages(ctxt, sz)) != 0 )
+    {
+        sz = sizeof(*ctxt);
+        if ( (rc = lock_pages(ctxt, sz)) != 0 )
+            return rc;
+    }
 
     rc = do_domctl(xc_handle, &domctl);
 
     if ( ctxt != NULL )
-        unlock_pages(ctxt, sizeof(*ctxt));
+        unlock_pages(ctxt, sz);
 
     return rc;
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

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