[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |